相关文章
设计模式(一)设计六大原则
设计模式(二)单例模式的七种写法
设计模式(三)建造者模式
设计模式(四)简单工厂模式
设计模式(五)观察者模式
设计模式(六)代理模式

1.装饰模式简介

装饰模式介绍

装饰模式是结构型设计模式之一,不必改变类文件和使用继承的情况下,动态地扩展一个对象的功能,是继承的替代方案之一。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

定义

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

装饰模式结构图

  • Component:抽象组件,给对象动态的添加职责。
  • ConcreteComponent:组件具体实现类。
  • Decorator:抽象装饰者,继承Component,从外类来拓展Component类的功能,但对于Component来说无需知道Decorator的存在。
  • ConcreteDecorator:装饰者具体实现类。

2.装饰模式的简单实现

装饰模式在现实生活中有很多例子,比如给一个人穿上各种衣服,给一幅画涂色上框等等,这次我要举得例子有些不同,举一个武侠修炼武功的例子:杨过本身就会全真剑法,有两位武学前辈洪七公和欧阳锋分别传授杨过打狗棒法和蛤蟆功,这样杨过除了会全真剑法还会打狗棒法和蛤蟆功。

抽象组件(Component)

作为武侠肯定要会使用武功的,我们先定义一个武侠的抽象类,里面有使用武功的抽象方法:

public abstract class Swordsman {/*** Swordsman武侠有使用武功的抽象方法*/public abstract void attackMagic();
}

组件具体实现类(ConcreteComponent)

被装饰的具体对象,在这里就是被教授武学的具体的武侠,他就是杨过,杨过作为武侠当然也会武学,虽然不怎么厉害:

public class YangGuo extends Swordsman{@Overridepublic void attackMagic() {//杨过初始的武学是全真剑法System.out.println("杨过使用全真剑法");}
}

抽象装饰者(Decorator)

抽象装饰者保持了一个对抽象组件的引用,方便调用被装饰对象中的方法。在这个例子中就是武学前辈要持有武侠的引用,方便教授他武学并“融会贯通”:

public abstract class Master extends Swordsman{private Swordsman mSwordsman;public Master(Swordsman mSwordsman){this.mSwordsman=mSwordsman;}@Overridepublic void attackMagic() {mSwordsman.attackMagic();}
}

装饰者具体实现类(ConcreteDecorator)

这个例子中用两个装饰者具体实现类,分别是洪七公和欧阳锋,他们负责来传授杨过新的武功:

public class HongQiGong extends Master {public HongQiGong(Swordsman mSwordsman) {super(mSwordsman);}public void teachAttackMagic(){System.out.println("洪七公教授打狗棒法");System.out.println("杨过使用打狗棒法");}@Overridepublic void attackMagic() {super.attackMagic();teachAttackMagic();}
}
public class OuYangFeng extends Master {public OuYangFeng(Swordsman mSwordsman) {super(mSwordsman);}public void teachAttackMagic(){System.out.println("欧阳锋教授蛤蟆功");System.out.println("杨过使用蛤蟆功");}@Overridepublic void attackMagic() {super.attackMagic();teachAttackMagic();}
}

客户端调用

经过洪七公和欧阳锋的教导,杨过除了初始武学全真剑法又学会了打狗棒法和蛤蟆功:

public class Client {public static void main(String[] args){//创建杨过YangGuo mYangGuo=new YangGuo();//洪七公教授杨过打狗棒法,杨过会了打狗棒法HongQiGong mHongQiGong=new HongQiGong(mYangGuo);mHongQiGong.attackMagic();//欧阳锋教授杨过蛤蟆功,杨过学会了蛤蟆功OuYangFeng mOuYangFeng=new OuYangFeng(mYangGuo);mOuYangFeng.attackMagic();}
}

3.装饰模式的优缺点和使用场景

优点

  • 通过组合而非继承的方式,动态的来扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为。
  • 有效避免了使用继承的方式扩展对象功能而带来的灵活性差,子类无限制扩张的问题。
  • 具体组件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体组件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。

缺点

  • 装饰链不能过长,否则会影响效率。
  • 因为所有对象都是继承于Component,所以如果Component内部结构发生改变,则不可避免地影响所有子类(装饰者和被装饰者),如果基类改变,势必影响对象的内部。
  • 比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐,所以只在必要的时候使用装饰者模式。

使用场景

  • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
  • 需要动态地给一个对象增加功能,这些功能可以动态的撤销。
  • 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。

4.装饰模式和代理模式

在上一篇文章设计模式之代理模式中我们讲到了代理模式,你会觉得代理模式和装饰模式有点像,都是持有了被代理或者被装饰对象的引用。它们两个最大的不同就是装饰模式对引用的对象增加了功能,而代理模式只是对引用对象进行了控制却没有对引用对象本身增加功能。

转载于:https://www.cnblogs.com/itrena/p/7434247.html

设计模式(七)装饰模式相关推荐

  1. 设计模式之装饰模式20170726

    结构型设计模式之装饰模式: 一.含义 动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活. 通俗来讲,装饰模式是对类的功能进行加强或减弱. 二.代码说明 1.主要有两个角 ...

  2. java设计模式之装饰模式_Java中的装饰器设计模式

    java设计模式之装饰模式 装饰器设计模式允许在运行时将附加职责或行为动态附加到对象. 它是一种结构模式,利用聚合来组合这些行为. 在本教程中,我们将学习实现装饰器模式. UML图: 让我们从装饰器模 ...

  3. 大话设计模式之装饰模式(python实现)

    大话设计模式之装饰模式 使用场景 定义 装饰模式结构图 python实现装饰模式 代码结构图 优点 使用场景 建造过程不稳定,不确定.把所需的功能按照正确的顺序串联起来进行控制. 新加入的东西仅仅是为 ...

  4. 设计模式之装饰模式详解(附应用举例实现)

    文章目录 1 装饰模式介绍 2 装饰模式详解 2.1 装饰模式结构 2.2 装饰模式实现 2.3 装饰模式应用举例 3 透明装饰模式和半透明装饰模式 1 装饰模式介绍 在生活中,我们往往会给图片增加一 ...

  5. 设计模式之 装饰模式

    设计模式之 装饰模式 概述: 装饰模式(Decorator Pattern) 又叫装饰者模式:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也 ...

  6. java常用设计模式七:装饰模式

    一.概念 装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为. 基本角色: 抽象构件:它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的 ...

  7. JAVA设计模式之装饰模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述装饰(Decorator)模式的: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替 ...

  8. 设计模式之装饰模式(Decorator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  9. 设计模式之三 装饰模式

    1.场景模拟 这样让想起了老李,我跟老李是很要好的哥们,当然他不像我还是光棍,所以他不光有友情还有爱情了,不过,就在最近几天他们吵架啦,什么原因?就不多说啦,总之身为男人的老李还是决定主动认错挽回女方 ...

  10. 大话设计模式之装饰模式

    装饰模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 通过下列代码加深下理解 ...

最新文章

  1. 绿色噱头VS数据中心的机会
  2. Linux下中文man帮助安装。
  3. 反向Socket连接
  4. 博客已从百度空间搬家到此
  5. 国家语言,语言代码,locale id对应表
  6. ASP.NET中Url重写后,打不开真正的Html页面
  7. 最新剑指offer刷题笔记js(含新旧俩版所有题)
  8. 史上最强最贵 Mac Pro 诞生,iPadOS 和 iOS 分家!WWDC19 全面总结
  9. 库、dlopen、函数名都正确,dlsym出错了,怎么回事
  10. 计算机组成原理考试试题答案,计算机组成原理期末考试试题及答案 (精选可编辑)...
  11. 磁力计简单水平较准算法
  12. 基于Vue的车辆租赁管理系统设计与实现
  13. Region Proposal Network
  14. DDS产生双频正弦波及叠加
  15. 基于张正友平面标定法的摄像机标定及GUI实现
  16. 天合光能为澳大利亚太阳能农场供应双玻组件
  17. Anaconda安装完python文件.py不显示黄蓝图标
  18. JAVA+MySQL 图书馆借阅信息管理系统
  19. 2023-2028年中国硫氰酸钠市场发展动态及前景预测报告
  20. Maya角色UV展平技巧笔记

热门文章

  1. Android中使用logwrapper来重定向应用程序的标准输出
  2. Oracle重建回滚段
  3. Pair Project:电梯控制程序 编写心得 最新版
  4. window.opener方法的使用 刷新父页面
  5. Spark源码分析之HashShuffle读写流程
  6. Spark源码分析之SparkContext
  7. (18)FPGA时序逻辑与组合逻辑(第4天)
  8. (49)System Verilog 类中数组长度约束
  9. Vivado MMCM IP核接口信号介绍
  10. linux系统oracle启动过程,Linux主机下配置Oracle 10G自动启动过程记