装饰模式(Decorator/Wrapper Pattern)

背景

在项目中运用该设计模式解决了问题,现对其进行总结,为以后思考问题和解决方案做备忘。

是什么

  • 是「面向对象编程」领域中的一种「动态」地往一个「类」中添加新的「行为」的设计模式

  • 在 CPU 看来就是在一段「机器指令」「之前」和「之后」插入新的指令,从而达到动态改变原有指令的「输入参数」和「输出结果」的目的

  • 在数据结构上看,类似在一个「链表节点」之前「插入」一个新的节点,这样消息从前向后传递的时候先到达装饰节点再到达被装饰节点


    decorator.png
  • 用一个自己的对象「替换」原有对象,「拦截」/「代理」原有对象的所有「消息」,增加/删除原有对象的功能

解决了什么问题

  • 通过运用装饰模式,可以在运行时动态增加一个类的功能
  • 类继承是「编译时」增加类的行为,装饰模式是「运行时」增加行为(编译出来的程序一般在外存,运行时一般在内存)
  • 当有几个「相互独立」的功能需要扩充时,类继承和装饰模式的区别就变得比较明显了。比如对用户头像进行美颜、大眼睛、瓜子脸、白皮肤等组合处理,如果这些功能的每个组合都写一个类进行实现的话那么代码就变得很多、很死、很臭。这时如果每个小的功能做成一个类,每个类的输入和输出都解耦,然后运行时根据需要组合成链表,这样更加灵活。
  • 装饰模式面向「运行时」的「对象实例」,这些对象可以根据需要进行任意组合改变消息处理流程,从而达到优雅解决问题的目的
  • 经典运用装饰模式的例子是 Java I/O Streams 框架

使用方法

调用者

    class Client {
        public static void main(String[] args){
            // one component
            Component component = new ConcreteComponent();
            // decor component with decorator
            Component decorator = new ConcreteDecorator(component);
            // send msg to decorator
            decorator.operation();
        }
    }

内部实现

    interface Component{
        void operation();
    }
    
    class ConcreteComponent implements Component {
        void operation(){
            // to sth.
        }
    }
    
    class ConcreteDecorator implements Component {
        Component component;
        
        ConcreteDecorator(Component component){
            this.component = component;
        }

        void operation(){
            // do sth. before 
            component.operation();
            // do sth. after
        }
    }

练习题

  • Android Framework 层 Decorator/Wrapper 的经典实现(通过关键字搜索出相应模块)
  • ContextWrapper 类图
  • DrawableWrapper 类图
  • Java I/O Streams 类图
  • 字节流、字符流
  • 缓冲、格式化能力

总结

  • 从数据结构角度考虑,Decorator/Wrapper 模式是经常被使用的模式,因为每一小块的数据总会被大块的数据结构包裹起来(挂到大块的数据内部)。最经典的例子就是网络层的数据组装和拆卸。

参考

[1] 装饰模式

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

推荐阅读更多精彩内容