GOF 设计模式 Decorator模式 笔记
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模式 笔记相关推荐
- GOF 设计模式Facade模式 笔记
Facade(外观) 意图:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 结构图 在以下情况使用: 当你要为一个复杂子系统提供一个简 ...
- GOF 设计模式 builder模式笔记
Builder(生成器) 意图:将一个复杂对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示. 在以下情况使用Builder模式 当创建复杂的对象应该独立于该对象的组成部分以及它们的装配 ...
- 设计模式-Decorator模式
目录 一个例子(贪玩蓝月) 传统继承实现 装饰器模式实现 对比 总结 Decorator(装饰器)模式属于结构型模式. 比如当其需要三种不同的附加特性,可以为其创建三个派生类.但是若它还需要同时具有其 ...
- 设计模式-Decorator模式(装饰者模式)
文章目录 装饰者模式 代码实现 为什么使用装饰者模式 装饰者模式 假如现在有一块蛋糕, 加上奶油就是奶油蛋糕.如果继续再加上草莓,就是草莓蛋糕,再加点蜡烛,就变成了生日蛋糕.不论是蛋糕.奶油蛋糕.草莓 ...
- Java设计模式-代理模式笔记
代理模式 0 什么是代理模式 理解方式1 理解方式2 1 静态代理 1.1 代码实现 1.2 方法解读 1.3 优缺点 2 动态代理 2.1 具体实现 2.2 方法解读 2.3 注意 3 Cglib代 ...
- GoF设计模式——状态模式(C++实现)
文章目录 概念 UML结构图 代码实现 状态模式的使用场景 概念 状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为. 在探讨状态模式的优雅之前,先来看看以下代码场景: enum ...
- 装饰者设计模式(Decorator Pattern)
GOF设计模式 Decorator Pattern 装饰者设计模式 装饰者模式应用场景 • 1.想透明并且动态地给对象增加新的职责的时候. • 2.给对象增加的职责,在未来存在增加或减少可能. • 3 ...
- GoF设计模式之代理设计模式
该文章首发于GoF设计模式-代理模式 概述 代理模式(Proxy Pattern),为其他对象提供一种代理以控制对这个对象的访问. 代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可 ...
- 设计模式学习笔记——装饰(Decorator)模式
设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...
最新文章
- js获取html代码中所有图片地址
- 放大器非线性失真研究装置设计报告_走进自动化 | 本科生科技论文报告会圆满结束...
- 【selenium】 selenium web测试工具介绍(一)
- 1021 个位数统计 (15分)——10行代码AC(解题报告)
- 工业级光纤收发器产品性能特点介绍
- 投资数据中心所考虑的重要因素
- Java并发编程:面试必备之线程池
- daad转换器实验数据_实验十一DAAD转换器.doc
- Maker工作室_激光雕刻机使用方法
- 现在Web前端培训,哪个机构比较好?
- HIT CS科班对计算机专业素养的理解
- 《药物设计学》单词表
- DSO windowed optimization 代码 (4)
- 京东店铺所有商品API接口(JD整店商品查询API接口)
- 164work 综合练习1
- JAVA自学材料大全与技术路线
- 【Unity】 结合DoTween制作抛物线效果
- 小目标检测算法SNIPER—— SNIP的实战版本 (目标检测)(two-stage)(深度学习)(Arvix 2018)
- 制作机顶盒CM311-1a的armbian img文件
- GraphicConverter Mac图片浏览和编辑器