装饰器模式/包装器模式

在电视剧《相爱十年》中,主角肖然把出现了品控问题的安尔雅肥皂换了个包装、改了套说辞变成了全新的品牌浴雪清,并成功的推销出去了,得到了第一桶金。这就说所谓的包装,本质上并没有改变,但是外在表现形式上有了改动,给人感觉这好像是一个全新的物种一样。

日光之下并无新事,这话出自《圣经》,讲的就是这道理。

在编程领域同样会存在这种包装的需求,比如我们需要更改某个类的行为,但它是 final 类型的,不能继承。或者是干脆就不想继承,想通过组合的方式去包装它,以达到这种修改对象行为的目的。

比如 JavaWeb 中的 HttpServletRequestWrapper 类就是一个典型的包装器类,它就是应用了包装器设计模式的思想。这个类持有了原有的 request 对象,实现了 ServletRequest 接口,重写了它的所有方法,并提供了针对 HTTP 协议的个性化功能。

该设计模式中有几个角色

学习启示:学习设计模式的过程中,搞清楚这个模式里面有几个角色,也就是有几个对象,理顺他们的关系,也就理解了这个设计模式。

在包装器模式中从根本上来说,就只有被包装对象和包装对象。他们之间是一种组合关系,包装对象内部持有了被包装对象,并提供了一些被包装对象所没有的扩展行为。多出来或者改动的行为就是包装!

如何实现包装器模式/装饰器模式

「英文时间」:decorator n. 装饰器
「英文时间」:wrapper n. 包装材料

包装器设计模式的核心就是,通过组合和继承同一个接口的方式,不需要更改的行为就用默认实现,需要更改的就自定义修改。

下面还是以一个上面安尔雅和浴雪清肥皂的例子来讲解具体的代码如何写,UML 类图和具体操作步骤如下:


装饰器模式.png
  • 第一步:定义包装类和被包装类共同的接口
  • 第二步:定义被包装类,并实现接口的方法
  • 第三步:定义包装类,并通过构造函数接收被包装类对象,将其作为内部属性持有。然后按照实际选择修改或者新增行为!

共同的接口:肥皂

//肥皂的接口
public interface Soap {
    void wash();
    void name();
}

被包装类:安尔雅肥皂

//
class AnErYa implements Soap{
    @Override
    public void wash() {
        System.out.println("肥皂洗澡更干净");
    }
    @Override
    public void name() {
        System.out.println("安尔雅");
    }
}

包装类:浴雪清肥皂

class YuXueQing implements Soap{
    private Soap sopa;//持有被包装类的引用
    public YuXueQing(Soap s) {
        this.sopa = s;//获取被包装类的引用
    }
    //修改被包装对象的行为
    @Override
    public void name() {
        System.out.println("浴雪清");
    }
    //定义默认实现
    @Override
    public void wash() {
        this.sopa.wash();
    }
    //浴雪清新增行为
    public void medicine(){
        System.out.println("中药成分");
    }
}

测试代码:

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

推荐阅读更多精彩内容

  • 参考资料:菜鸟教程之设计模式 设计模式概述 设计模式(Design pattern)代表了最佳的实践,通常被有经验...
    Steven1997阅读 1,171评论 1 12
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,933评论 1 15
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 人想要要改变自己的命运是需要多大的勇气
    DABO_ce35阅读 149评论 0 0
  • 男人喜欢什么样的女人呢? 男人喜欢一无所有的女人,没有梦想却傻傻支持男人梦想的女人。 凉子今年就32岁了。 现在是...
    风子啊阅读 687评论 0 1