设计模式之装饰模式
来源:互联网 发布:linux运维个人简历 编辑:程序博客网 时间:2024/06/08 09:16
设计模式之装饰模式
装饰模式的简单介绍
通常来说,我们要扩展一个类的功能,可以有两种方式,一种是继承该类,并且增加新的功能;另外一种就是采用装饰模式,在设计的时候,让该类本身具有动态扩展性,在以后需要扩展新功能的时候,可以动态地进行扩展,经常使用到的I/O流就是装饰模式的典型应用了。
装饰模式的具体实现
这里通过一个汽车的案例来深入学习装饰模式,假设有一种汽车,只能够在陆地上跑,但是可以为其添加新的功能,使其具有其他的能力,比如飞行、在海面行走等,使用普通的方法来实现就是为其定义多个子类,比如飞行功能的汽车,在海面行走的汽车,具有飞行以及在海面行走的汽车…可以看到,当其能力比较多的时候,需要派生非常多的子类,这个时候就比较痛苦了,而且,不一定扩展出来的类就需要用到,这就会带来很大的冗余了;使用装饰模式则可以避免这样的问题出现。
// 首先我们应该具有普通的汽车/** * 抽象汽车类 */abstract class Car { public abstract void run();}/** * 普通的汽车 */class OrdinaryCar extends Car{ @Override public void run() { System.out.println("在陆地上跑的功能"); }}// 然后需要具有扩展能力的汽车,方便进行扩展/** * 具有扩展能力的汽车 */abstract class XCar extends Car{ private Car car; public XCar(Car car) { this.car = car; } // 扩展新能力 protected abstract void otherFunction(); @Override public void run() { car.run(); otherFunction(); }}/** * 飞行功能 */class FlyingCar extends XCar{ public FlyingCar(Car car) { super(car); } @Override protected void otherFunction() { System.out.println("飞行功能"); }}/** * 海面行走功能 */class SwimmingCar extends XCar{ public SwimmingCar(Car car) { super(car); } @Override protected void otherFunction() { System.out.println("海面行走功能"); }}
如上所示,我们定义了普通的汽车,具有扩展能力的汽车以及一些对应的功能,比如飞行、海面行驶等。接下来,客户就可以根据需要进行组合了
Car car = new OrdinaryCar(); // 普通汽车FlyingCar fcar = new FlyingCar(car); // 具有飞行功能的汽车SwimmingCar scar = new SwimmingCar(new FlyingCar(new Car())) // 具有飞行功能以及海面行驶功能的汽车
可以看到,无论功能多么复杂,只需要定义基本的功能,然后根据需要进行组合即可,不再需要为各种功能的组合定义对应的类了,当想要增加新的功能的时候,也只需要定义新的功能,就可以与之前的功能无缝对接了。
总结
装饰模式,是一种具有动态扩展类功能的模式,适合用于功能或者说选择比较多的情况下,通过装饰模式,可以根据需要进行功能的组合,而不需要为其定义庞大的子类,而且在需要增加新的功能的时候,直接通过这种方式,原有的功能全部无需改动,而可以使得原有的产品具有新增加的功能。
阅读全文
0 0
- 设计模式之装饰
- 设计模式之装饰
- 设计模式之装饰
- 设计模式之装饰模式
- 设计模式之装饰模式
- 设计模式之装饰模式
- 设计模式之装饰模式
- 设计模式之装饰模式
- 设计模式之 装饰模式
- 设计模式之-装饰模式
- 设计模式之装饰模式
- 设计模式之装饰模式
- 设计模式之装饰模式
- 设计模式之装饰模式
- 设计模式之装饰模式
- 设计模式之装饰模式
- 设计模式之装饰模式
- 设计模式之装饰模式
- 【Zynq学习笔记4】问题汇总
- java线程join()源码中wait()和isAlive()的问题
- HTML基础-认识HTML 01
- AE,线、面转多点
- mybatis中trim标签的使用
- 设计模式之装饰模式
- iPhone屏幕尺寸、分辨率及适配
- 004 Median of Two Sorted Arrays ⭐
- python的数据类型和典型集合
- 【《我爱问连岳5》-读书笔记】
- window系统cmd什么命令都用不了,显示 不是内部或外部命令,也不是可运行的程序或批处理文件 解决办法
- 该如何理解AMD ,CMD,CommonJS规范
- 学生信息管理系统c++
- Java继承知识总结