结构型模式:装饰模式
我曾经以为应该用继承处理一切。后来领教到运行时扩展,远比编译时期的继承威力大。
本章可以称为“给爱用继承的人一个全新的设计眼界”。我们即将再度探讨典型的继承滥用问题。在本章将会学到如何使用对象组合的方式,做到在运行时装饰类。一旦你熟悉了装饰的技巧,你将能在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责。
如果仅仅使用继承,那么关系将会如下图:
由于业务的扩展产生很多的子类,所以我们可以通过装饰模式,从而进行组合扩展。
代码实现如下:
package decorater;
public interface ICar {
void move();
}
package decorater;public class Car implements ICar {@Overridepublic void move() {System.out.println("陆地上跑");}
}
package decorater;//装饰类
public class SuperCar implements ICar { protected ICar car;public SuperCar(ICar car) {this.car = car;}@Overridepublic void move() {car.move();}
}
package decorater.superCar;import decorater.ICar;
import decorater.SuperCar;public class AICar extends SuperCar {public AICar(ICar car) {super(car);}@Overridepublic void move() {
super.move(); //基础功能System.out.println("智能遥控"); //新增功能}
}
package decorater.superCar;import decorater.ICar;
import decorater.SuperCar;public class FlyCar extends SuperCar{public FlyCar(ICar car) {super(car);}@Overridepublic void move() { super.move(); //基础功能System.out.println("天上飞"); //新增功能}
}
package decorater.superCar;import decorater.ICar; import decorater.SuperCar;public class WaterCar extends SuperCar {public WaterCar(ICar car) {super(car);}@Overridepublic void move() { super.move(); //基础功能System.out.println("水上游"); //新增功能
} }
package decorater;import decorater.superCar.AICar;
import decorater.superCar.FlyCar;
import decorater.superCar.WaterCar;public class test {public static void main(String[] args) {ICar car = new Car();car.move();System.out.println("+++++++++++普通车++++++++++++++");WaterCar waterCar = new WaterCar(car);waterCar.move();System.out.println("+++++++++++水上游的超跑++++++++++++++");AICar aiCar = new AICar(waterCar);aiCar.move();System.out.println("+++++++++++人工智能的水上游超跑++++++++++++++");SuperCar superCar = new FlyCar(aiCar);superCar.move();System.out.println("+++++++++++集齐所有功能的超跑++++++++++++++");}
}
结果:
陆地上跑
+++++++++++普通车++++++++++++++
陆地上跑
水上游
+++++++++++水上游的超跑++++++++++++++
陆地上跑
水上游
智能遥控
+++++++++++人工智能的水上游超跑++++++++++++++
陆地上跑
水上游
智能遥控
天上飞
+++++++++++集齐所有功能的超跑++++++++++++++
装饰模式:
优点:动态的为一个对象增加新的功能,无需通过继承增加子类就能拓展对象的新功能,同时避免类型体系的快速膨胀,即避免了子类数量过多。实现灵活,易于管理。
缺点:实现起来易于出错,不易调试。
结构型模式:装饰模式相关推荐
- 设计模式-结构型模式-装饰模式
设计模式-结构型模式-装饰模式 栗子 以成绩单需要家长签字为要求. 成绩单类图 // 抽象成绩单 public abstract class SchoolReport{// 成绩单你的成绩情况publ ...
- 结构型模式-装饰模式(扩展系统功能)
目录 1. 定义 2. 结构 3. 代码实现 4. 透明装饰模式与半透明装饰模式 4.1 透明装饰模式 4.2 半透明装饰模式 5. 注意事项 6. 优缺点 7. 适用场景 8. 个人理解 参考 装饰 ...
- 5.4结构型模式—————装饰模式
装饰模式的定义与特点 装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式. 装饰(Decorator)模式 ...
- 结构型模式——装饰模式
装饰模式的定义与特点 装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式. 装饰(Decorator)模式 ...
- 【设计模式】结构型模式——装饰模式
文章目录 一.定义 二.问题 三.解决方案 四.实现 五.UML图 六.装饰模式应用场景 七.总结 优点 缺点 八.与其他模式的关系 一.定义 装饰模式是一种结构型设计模式, 允许你通过将对象放入包含 ...
- 10 结构型模式-----装饰模式
模式动机(Decorator Pattern):我们在给一个类进行功能扩展时,总是通过继承或者复合关系,使得一个类具有其他相关类型的功能,继承本身属于静态关联,派生类比较臃肿,使用者也不能控制增加功能 ...
- 结构型模式-----装饰模式(decorator)
1.装饰模式 动态的给一个对象添加一些额外的职责,就增加功能来说Decorator模式相比生成子类更为灵活. 要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例. 实例一: publ ...
- C++结构型模式-装饰模式
1.1 基本概念 装饰器模式(Decorator Pattern):动态地给一个对象增加一些额外的职责,就增加功能来说,装饰器比生成子类实现更为灵活. 装饰器可以在不改变对象本身的基础上给对象增加额外 ...
- 设计模式 — 结构型模式 — 装饰模式
目录 文章目录 目录 装饰模式 应用场景 代码示例 装饰模式 装饰模式,指的是在不需要改变原类和使用继承的情况下,动态地扩展一个对象的功能.它通过创建一个包装对象,也就是 Python 中的装饰器来包 ...
- 设计模式09: Decorator 装饰模式(结构型模式)
Decorator 装饰模式(结构型模式) 子类复子类,子类何其多 加入我们需要为游戏中开发一种坦克,除了不同型号的坦克外,我们还希望在不同场合中为其增加以下一种多种功能:比如红外线夜视功能,比如水路 ...
最新文章
- 比起VR高端设备市场,三星或对移动VR平台更感兴趣
- ElasticSearch小操之Marvel,Sense
- java getattribute intvalue_Java NodeTree.getAttributeI方法代码示例
- Reverse Integer
- ASP.NET Core 异常重试组件 Polly
- 《网易智企技术合辑》正式发布
- 利用WCF的双工通讯实现一个简单的心跳监控系统
- dart系列之:还在为编码解码而烦恼吗?用dart试试
- Hadoop-RPC应用demo
- 【kubernetes系列】master节点部署Pod处于Pending状态
- Leetcode每日一题:33.search-in-rotated-sorted-array(搜索旋转排序数组)
- jQuery给页面弹出层添加半透明背景
- python之matplotlib中plt.show()不显示
- FJUT 借教室 (线段树区间查询+区间修改)
- SVN server
- Go语言 channel 管道 阻塞 死锁 经典问题
- STC单片机 闪烁灯,LED流水灯 程序讲解
- php固定登录账号,PHP实现会员单一账号登录
- 22 信息系统安全管理
- dva Reducers与Effects的使用介绍