• 浅谈Java设计模式——装饰模式(Decorator)


    一、概述

            动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

    二、使用场景

    1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 

    2.处理那些可以撤消的职责。 

    3.当不能采用生成子类的方法进行扩充时。

    三、参与者

    1.Component 定义一个对象接口,可以给这些对象动态地添加职责。 

    2.ConcreteComponent 定义一个对象,可以给这个对象添加一些职责。

    3.Decorator 维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。 

    4.ConcreteDecorator 就是具体的装饰对象,起到该Component添加职责的功能。

    四、类图

    五、代码示例

    1.Component接口:

    /**
     * 定义Component接口Person
     * @author zhipeng_Tong
     */
    public interface Person {
        void speak();
    }

    2.ConcreteComponent:

    /**
     * ConcreteComponent类,即Person的实现类
     * @author zhipeng_Tong
     */
    public class Speaker implements Person {
        @Override
        public void speak() {
            System.out.println("时光的荏苒");
        }
    }

    3.Decorator抽象类:

    /**
     * Decorator抽象类,实现了(Component接口的)Person
     * @author zhipeng_Tong
     */
    public abstract class Decorator implements Person {
        protected Person person;
    
        public void setPerson(Person person) {
            this.person = person;
        }
    
        @Override
        public void speak() {
            if (person != null)
                person.speak();
        }
    }

    4.ConcreteDecorator装饰类:

    public class ConcreteDecoratorA extends Decorator {
        @Override
        public void speak() {
            super.speak();
            seconedSpeak();
            System.out.println("ConcreteDecoratorA...Over");
        }
    
        private void seconedSpeak() {
            System.out.println("它蹉跎了所有");
        }
    }
    

    public class ConcreteDecoratorB extends Decorator {
        @Override
        public void speak() {
            super.speak();
            seconedSpeak();
            System.out.println("ConcreteDecoratorB...Over");
        }
    
        private void seconedSpeak() {
            System.out.println("他向我...");
        }
    }

    5.测试代码

    public class Client {
        public static void main(String[] args) {
            Speaker speaker = new Speaker();
            ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA();
            ConcreteDecoratorB concreteDecoratorB = new ConcreteDecoratorB();
    
            concreteDecoratorA.setPerson(speaker);
            concreteDecoratorB.setPerson(concreteDecoratorA);
            concreteDecoratorB.speak();
        }
    }

    运行结果:

    时光的荏苒
    它蹉跎了所有
    ConcreteDecoratorA...Over
    他向我...
    ConcreteDecoratorB...Over

  • 相关阅读:
    KubeSphere 社区开源负载均衡器 Porter 进入 CNCF 云原生全景图
    The Overview of KubeSphere 3.0
    对象存储在无人驾驶高精度地图的场景实践
    谁来打通混合云“最后一公里”?唯有容器混合云
    QingStor 对象存储架构设计及最佳实践
    如何通过IAM打造零信任安全架构
    智能家居巨头 Aqara 基于 KubeSphere 打造物联网微服务平台
    微信小程序集成jenkins自动打码
    windows运行python,提示import win32file ImportError: DLL load failed: 找不到指定的程序。
    centos7搭建easy-mock服务
  • 原文地址:https://www.cnblogs.com/IdealSpring/p/11871174.html
Copyright © 2020-2023  润新知