装饰模式

装饰模式又名包装模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

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

原理:

增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口。

好处:

  1. 使主功能和附加功能相分离,可独立扩展。
  2. 降低主功能和附加功能之间的耦合性。

模式中的角色

类图:

image

2.1 抽象构建(Component):定义一个抽象接口,用以给这些对象动态地添加职责。

2.2 具体构建(ConcreteComponent):定义一个具体的对象,也可以给这个对象添加一些职责。这个类是主功能类。

2.3 装饰类(Decorator): 装饰抽象类,继承了Component,从外类来扩展Component类的功能。

2.4 具体装饰者(Decorator1,2,3):负责给构建对象添加职责。附加功能类。

下面是具体代码实现:

抽象构件类:装饰类的公共接口

    public interface Component {  
        void sampleOperation();  
    }  

具体构件类(主功能类):

        public class ConcreteComponent implements Component{  
      
        public ConcreteComponent() {  
              
        }  
        @Override  
        public void sampleOperation() {  
            /*
            * 实现主功能
            */
            System.out.println("ConcreteComponent");  
        }  
          
    }  

装饰类(所有附加功能类的父类):

    public class Decorator implements Component{  
        protected Component component;  
        public Decorator(Component component) {  
            this.component = component;//component为对另一个类对象的引用  
        }  
        public Decorator() {}  
        @Override  
        public void sampleOperation() {
            /*
            * 实现附加功能
            */
            component.sampleOperation();  
        }  
          
    }  

具体装饰类(附加功能类):Decorator1

    public class Decorator1 extends Decorator{  
        public Decorator1(Component component) {  
            super(component);  
        }  
      
        @Override  
        public void sampleOperation() {
            /*
            * 实现附加功能
            */
            System.out.println("Decorator1");  
            component.sampleOperation();  
        }  
      
    }  

具体装饰类(附加功能类):Decorator2

    public class Decorator2 extends Decorator {  
      
        public Decorator2(Component component) {  
            super(component);  
              
        }  
      
        @Override  
        public void sampleOperation() {  
            /*
            * 实现附加功能
            */
            System.out.println("Decorator2");  
            component.sampleOperation();  
        }  
    }  

具体装饰类(附加功能类):Decorator3

    public class Decorator3 extends Decorator{  
      
        public Decorator3(Component component) {  
            super(component);  
        }  
      
        @Override  
        public void sampleOperation() {  
            /*
            * 实现附加功能
            */  
            System.out.println("Decorator3");  
            component.sampleOperation();  
        }  
          
    }  

客户端:调用了Decorator1的sampleOperation(),实现了四个功能。

    public class TestDecorator {  
      
        public static void main(String[] args) {  
            //定义主功能类
            ConcreteComponent c = new ConcreteComponent();
            
            //定义三个附加功能类。
            Decorator1 d1 = new Decorator3(c);
            Decorator2 d2 = new Decorator2(d1);
            Decorator1 d3 = new Decorator1(d2);//将三个功能都交给Decorator3
            //实现功能
            d1.sampleOperation();
        }  
      
    }  

输出:

Decorator3

Decorator2

Decorator1

ConcreteComponent

总结:

优点:

  1. 比静态继承更灵活 与对象的静态继承相比,Decorator模式提供了更加灵活的向对象添加职责的方式,可以使用添加和分离的方法,用装饰在运行时刻增加和删除职责.
  2. 降低主功能和附加功能之间的耦合性。
  3. 降低了主功能类的复杂度,遵循了开闭原则。

适用情景:

  1. 当需要为已有功能动态地添加更多功能时。
  2. 类的核心功能无需改变,只是需要添加新的功能时。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 咪蒙爆款文章分析: 1、从文章标题角度 标题:致贱人:我凭什么要帮你?! 关键词:贱人 凭什么 触发点:首先每个人...
    Lxy林小隐阅读 2,405评论 0 0
  • 德经 01(通行本38) 上德不德,是以有德;下德不失德,是以无德。上德无为而无以为也;上仁为之而无以为也;上义为...
    王熙清阅读 3,904评论 0 0
  • 以前想,人生赢家,是那些在事业中取得大成就的人。例如企业家,做了很多的项目,取得事业上的成就;明星,很有名气,受到...
    阳光心程阅读 3,150评论 8 9
  • 风波亭上出风波, 精忠报国真可笑。 一日七令莫须有, 为何怒发不出鞘。
    简村小吹阅读 2,405评论 6 7

友情链接更多精彩内容