我曾经以为应该用继承处理一切。后来领教到运行时扩展,远比编译时期的继承威力大。
本章可以称为“给爱用继承的人一个全新的设计眼界”。我们即将再度探讨典型的继承滥用问题。在本章将会学到如何使用对象组合的方式,做到在运行时装饰类。一旦你熟悉了装饰的技巧,你将能在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责。

如果仅仅使用继承,那么关系将会如下图:

由于业务的扩展产生很多的子类,所以我们可以通过装饰模式,从而进行组合扩展。

代码实现如下:

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("+++++++++++集齐所有功能的超跑++++++++++++++");}
}

结果:

陆地上跑

+++++++++++普通车++++++++++++++

陆地上跑

水上游

+++++++++++水上游的超跑++++++++++++++

陆地上跑

水上游

智能遥控

+++++++++++人工智能的水上游超跑++++++++++++++

陆地上跑

水上游

智能遥控

天上飞

+++++++++++集齐所有功能的超跑++++++++++++++

装饰模式:

优点:动态的为一个对象增加新的功能,无需通过继承增加子类就能拓展对象的新功能,同时避免类型体系的快速膨胀,即避免了子类数量过多。实现灵活,易于管理。

缺点:实现起来易于出错,不易调试。

结构型模式:装饰模式相关推荐

  1. 设计模式-结构型模式-装饰模式

    设计模式-结构型模式-装饰模式 栗子 以成绩单需要家长签字为要求. 成绩单类图 // 抽象成绩单 public abstract class SchoolReport{// 成绩单你的成绩情况publ ...

  2. 结构型模式-装饰模式(扩展系统功能)

    目录 1. 定义 2. 结构 3. 代码实现 4. 透明装饰模式与半透明装饰模式 4.1 透明装饰模式 4.2 半透明装饰模式 5. 注意事项 6. 优缺点 7. 适用场景 8. 个人理解 参考 装饰 ...

  3. 5.4结构型模式—————装饰模式

    装饰模式的定义与特点 装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式. 装饰(Decorator)模式 ...

  4. 结构型模式——装饰模式

    装饰模式的定义与特点 装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式. 装饰(Decorator)模式 ...

  5. 【设计模式】结构型模式——装饰模式

    文章目录 一.定义 二.问题 三.解决方案 四.实现 五.UML图 六.装饰模式应用场景 七.总结 优点 缺点 八.与其他模式的关系 一.定义 装饰模式是一种结构型设计模式, 允许你通过将对象放入包含 ...

  6. 10 结构型模式-----装饰模式

    模式动机(Decorator Pattern):我们在给一个类进行功能扩展时,总是通过继承或者复合关系,使得一个类具有其他相关类型的功能,继承本身属于静态关联,派生类比较臃肿,使用者也不能控制增加功能 ...

  7. 结构型模式-----装饰模式(decorator)

    1.装饰模式 动态的给一个对象添加一些额外的职责,就增加功能来说Decorator模式相比生成子类更为灵活. 要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例. 实例一: publ ...

  8. C++结构型模式-装饰模式

    1.1 基本概念 装饰器模式(Decorator Pattern):动态地给一个对象增加一些额外的职责,就增加功能来说,装饰器比生成子类实现更为灵活. 装饰器可以在不改变对象本身的基础上给对象增加额外 ...

  9. 设计模式 — 结构型模式 — 装饰模式

    目录 文章目录 目录 装饰模式 应用场景 代码示例 装饰模式 装饰模式,指的是在不需要改变原类和使用继承的情况下,动态地扩展一个对象的功能.它通过创建一个包装对象,也就是 Python 中的装饰器来包 ...

  10. 设计模式09: Decorator 装饰模式(结构型模式)

    Decorator 装饰模式(结构型模式) 子类复子类,子类何其多 加入我们需要为游戏中开发一种坦克,除了不同型号的坦克外,我们还希望在不同场合中为其增加以下一种多种功能:比如红外线夜视功能,比如水路 ...

最新文章

  1. 比起VR高端设备市场,三星或对移动VR平台更感兴趣
  2. ElasticSearch小操之Marvel,Sense
  3. java getattribute intvalue_Java NodeTree.getAttributeI方法代码示例
  4. Reverse Integer
  5. ASP.NET Core 异常重试组件 Polly
  6. 《网易智企技术合辑》正式发布
  7. 利用WCF的双工通讯实现一个简单的心跳监控系统
  8. dart系列之:还在为编码解码而烦恼吗?用dart试试
  9. Hadoop-RPC应用demo
  10. 【kubernetes系列】master节点部署Pod处于Pending状态
  11. Leetcode每日一题:33.search-in-rotated-sorted-array(搜索旋转排序数组)
  12. jQuery给页面弹出层添加半透明背景
  13. python之matplotlib中plt.show()不显示
  14. FJUT 借教室 (线段树区间查询+区间修改)
  15. SVN server
  16. Go语言 channel 管道 阻塞 死锁 经典问题
  17. STC单片机 闪烁灯,LED流水灯 程序讲解
  18. php固定登录账号,PHP实现会员单一账号登录
  19. 22 信息系统安全管理
  20. dva Reducers与Effects的使用介绍

热门文章

  1. 10 个适合网店使用的免费 Bootstrap 模板
  2. 随机产生长度为20的字符串(数字和大小写字母)
  3. Sqlite基础及其与SQLServer语法差异
  4. Linux 安装完毕要做的事
  5. 【机器学习】K-Means算法的原理流程、代码实现及优缺点
  6. 使用ffmpeg对视频进行TS切片
  7. 根据经纬度计算范围_遗传算法可视化项目(插曲):关于距离的计算
  8. delphi 折叠代码 快捷键_我收藏的几个更快搬砖的vscode快捷键
  9. tcp 的ack, seq
  10. ubuntu9.10安装显卡驱动