Decorator(装饰)

意图:动态的给一个对象添加一些额外的职责。就添加功能来说,Decorator模式相比生成子类更为灵活

结构图:

在以下情况适合使用

  • 在不影响其他对象的情况下,以动态,透明的方式给单个对象添加职责
  • 处理那些可以撤销的职责
  • 当不能采用生成子类的方法进行扩充时,一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是,类定义被隐藏,或类定义不能用于生成子类。

实现:

就添加功能,扩展父类来说,装饰模式要比继承要灵活,而且可以有效避免类的爆炸。并且可以动态的增加职责。
有一部普通的手机,只能打电话,若是要加一个铃声功能,可以通过继承父类,子类去实现。若是要想接听振动,还可以在继承,在实现,若是又要铃声又要振动。。。。。
通过继承来实现功能的扩展,功能的组合方式越多,类的结构越复杂,类的数量越多,而且不能支持动态的增加减少职责。

装饰模式就可以给对象动态的添加职责。

phone

public abstract class Phone {abstract void call();
}

NormalPhone普通手机

public class NormalPhone extends Phone {@Overridevoid call() {System.out.println("打电话");}
}

PhoneDecorate 装饰器

public class PhoneDecorate extends Phone {@Overridevoid call() {}
}

BellPhoneDecorate 铃声装饰器

public class BellPhoneDecorate extends PhoneDecorate {private Phone phone;public BellPhoneDecorate(Phone phone) {this.phone = phone;}@Overridevoid call() {phone.call();System.out.println("铃声ing....");}
}

VibrancyPhoneDecorate 振动修饰

public class VibrancyPhoneDecorate extends PhoneDecorate {private Phone phone;public VibrancyPhoneDecorate(Phone phone) {this.phone = phone;}@Overridevoid call() {phone.call();System.out.println("振动ing....");}
}

Main

public class Main {public static void main(String[] args) {Phone normalPhone = new NormalPhone();System.out.println("普通手机");normalPhone.call();Phone bellPhone = new BellPhoneDecorate(normalPhone);System.out.println("铃声手机");bellPhone.call();Phone bellAndVPhone = new VibrancyPhoneDecorate( new BellPhoneDecorate(normalPhone));System.out.println("三体合一手机");bellAndVPhone.call();}
}

相关模式

Adapter:Decorator模式不同于Adapter模式,因为装饰进改变对象的职责而不改变他的接口;而适配器将给对象一个全新的接口
Composite:可以将装饰视为一个退化的,仅有一个组件的组合。然而,装饰仅给对象添加一些额外的职责,他的目的不在于对象聚集
Strategy:用一个装饰可以改变对象的外表;而Strategy模式使得你可以改变对象的内核。这是改变对象的两种途径。

GOF 设计模式 Decorator模式 笔记相关推荐

  1. GOF 设计模式Facade模式 笔记

    Facade(外观) 意图:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 结构图 在以下情况使用: 当你要为一个复杂子系统提供一个简 ...

  2. GOF 设计模式 builder模式笔记

    Builder(生成器) 意图:将一个复杂对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示. 在以下情况使用Builder模式 当创建复杂的对象应该独立于该对象的组成部分以及它们的装配 ...

  3. 设计模式-Decorator模式

    目录 一个例子(贪玩蓝月) 传统继承实现 装饰器模式实现 对比 总结 Decorator(装饰器)模式属于结构型模式. 比如当其需要三种不同的附加特性,可以为其创建三个派生类.但是若它还需要同时具有其 ...

  4. 设计模式-Decorator模式(装饰者模式)

    文章目录 装饰者模式 代码实现 为什么使用装饰者模式 装饰者模式 假如现在有一块蛋糕, 加上奶油就是奶油蛋糕.如果继续再加上草莓,就是草莓蛋糕,再加点蜡烛,就变成了生日蛋糕.不论是蛋糕.奶油蛋糕.草莓 ...

  5. Java设计模式-代理模式笔记

    代理模式 0 什么是代理模式 理解方式1 理解方式2 1 静态代理 1.1 代码实现 1.2 方法解读 1.3 优缺点 2 动态代理 2.1 具体实现 2.2 方法解读 2.3 注意 3 Cglib代 ...

  6. GoF设计模式——状态模式(C++实现)

    文章目录 概念 UML结构图 代码实现 状态模式的使用场景 概念 状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为. 在探讨状态模式的优雅之前,先来看看以下代码场景: enum ...

  7. 装饰者设计模式(Decorator Pattern)

    GOF设计模式 Decorator Pattern 装饰者设计模式 装饰者模式应用场景 • 1.想透明并且动态地给对象增加新的职责的时候. • 2.给对象增加的职责,在未来存在增加或减少可能. • 3 ...

  8. GoF设计模式之代理设计模式

    该文章首发于GoF设计模式-代理模式 概述 代理模式(Proxy Pattern),为其他对象提供一种代理以控制对这个对象的访问. 代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可 ...

  9. 设计模式学习笔记——装饰(Decorator)模式

    设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...

最新文章

  1. js获取html代码中所有图片地址
  2. 放大器非线性失真研究装置设计报告_走进自动化 | 本科生科技论文报告会圆满结束...
  3. 【selenium】 selenium web测试工具介绍(一)
  4. 1021 个位数统计 (15分)——10行代码AC(解题报告)
  5. 工业级光纤收发器产品性能特点介绍
  6. 投资数据中心所考虑的重要因素
  7. Java并发编程:面试必备之线程池
  8. daad转换器实验数据_实验十一DAAD转换器.doc
  9. Maker工作室_激光雕刻机使用方法
  10. 现在Web前端培训,哪个机构比较好?
  11. HIT CS科班对计算机专业素养的理解
  12. 《药物设计学》单词表
  13. DSO windowed optimization 代码 (4)
  14. 京东店铺所有商品API接口(JD整店商品查询API接口)
  15. 164work 综合练习1
  16. JAVA自学材料大全与技术路线
  17. 【Unity】 结合DoTween制作抛物线效果
  18. 小目标检测算法SNIPER—— SNIP的实战版本 (目标检测)(two-stage)(深度学习)(Arvix 2018)
  19. 制作机顶盒CM311-1a的armbian img文件
  20. GraphicConverter Mac图片浏览和编辑器

热门文章

  1. C++ STL-- mt19937
  2. 6脚数码管驱动方式(7脚类似)
  3. centos服务器拒绝ssh连接问题
  4. 微信小程序热门搜索功能实现
  5. 基于数字孪生的数字化车间升级方案
  6. HTML5实例练习——《排班查询》
  7. 设计模式(一)之策略模式
  8. php实现数组的笛卡尔积
  9. 工作组win7计算机无法访问,win7系统无法访问工作组怎么办
  10. 工程机械部件的大尺寸空间精度检测仪器