装饰模式

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

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

原理:

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

好处:

  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. 类的核心功能无需改变,只是需要添加新的功能时。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容

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