一、装饰模式概述

  (1)动态的为一个对象增加新的功能。

  (2)装饰模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。

      使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。

二、装饰模式实现细节

  (1)Componen 抽象构件角色:

      真实对象和装饰对象有相同的接口。这样,客户端就能够以真实对象相同的方式同装饰对象交互。

  (2)ConcreteComponent 具体构件角色(真是角色):

      IO 流中的FileInputStream、FileOutputStream

  (3)Decorator 装饰角色:

      持有一个抽象构件的引用。装饰对象接受所有客户端的请求,并把这些请求转发给真实的对象,这样就能在真实对象调用前后增加新的功能。

三、装饰模式情景导入

  场景:设计一款可以增加任意功能的汽车,除了陆地上跑以外,还可以随意增加天上飞、水上游、自动驾驶等功能。

 /**
* Component抽象构件角色
* @author CL
*
*/
public interface ICar {
void move();
} /**
* ConcreteComponent具体构件角色(真实角色)
* @author CL
*
*/
class Car implements ICar { @Override
public void move() {
System.out.println("陆地上跑!");
} } /**
* Decorator装饰角色
* @author CL
*
*/
class SuperCar implements ICar {
protected ICar car; public SuperCar(ICar car) {
this.car = car;
} @Override
public void move() {
car.move();
}
} /**
* ConcreteDecorator具体装饰角色
* 新增新的功能:天上飞
* @author CL
*
*/
class FlyCar extends SuperCar { public FlyCar(ICar car) {
super(car);
} public void fly() {
System.out.println("天上飞!");
} @Override
public void move() {
super.move();
fly();
} } /**
* ConcreteDecorator具体装饰角色
* 新增新的功能:水上游
* @author CL
*
*/
class WaterCar extends SuperCar { public WaterCar(ICar car) {
super(car);
} public void swim() {
System.out.println("水上游!");
} @Override
public void move() {
super.move();
swim();
} } /**
* ConcreteDecorator具体装饰角色
* 新增新的功能:人工智能 自动驾驶
* @author CL
*
*/
class AICar extends SuperCar { public AICar(ICar car) {
super(car);
} public void autoMove() {
System.out.println("自动驾驶!");
} @Override
public void move() {
super.move();
autoMove();
} }

  测试:

 /**
* 测试装饰模式
* @author CL
*
*/
public class Client { public static void main(String[] args) {
System.out.println("基本功能,陆地上跑-->");
Car car = new Car();
car.move(); System.out.println("\n增加新的功能,天上飞-->");
FlyCar flyCar = new FlyCar(car);
flyCar.move(); System.out.println("\n增加新的功能,水上游-->");
WaterCar waterCar = new WaterCar(car);
waterCar.move(); System.out.println("\n增加新的功能,水上游, 自动驾驶-->");
AICar aCar = new AICar(new WaterCar(car));
aCar.move(); System.out.println("\n增加新的功能,天上飞,水上游, 自动驾驶-->");
AICar c = new AICar(
new WaterCar(
new FlyCar(car)));
c.move();
} }

  控制台输出:

基本功能,陆地上跑-->
陆地上跑! 增加新的功能,天上飞-->
陆地上跑!
天上飞! 增加新的功能,水上游-->
陆地上跑!
水上游! 增加新的功能,水上游, 自动驾驶-->
陆地上跑!
水上游!
自动驾驶! 增加新的功能,天上飞,水上游, 自动驾驶-->
陆地上跑!
天上飞!
水上游!
自动驾驶!

四、装饰模式总结

  装饰模式(Decorator)也叫做包装器模式(Wrapper)

  装饰模式降低系统的耦合度,可以动态的增加或删除对象的职责,并使得需要装饰的具体构建类和具体装饰类可以独立变化,以便增加新的具体构建类和具体装饰类。

  优点:

    a. 扩展对象功能,比继承灵活,不会导致类个数急剧增加;

    b. 可以对一个对象进行多次装饰,创造出不同行为的组合,得到功能更加强大的对象;

    c. 具体构建类和具体装饰类可以独立变化,用户可以根据需要自己增加新的具体构件子类和具体装饰子类。

  缺点:

    a. 产生很多小对象,大量小对象占据内存,一定程度上影响性能;

    b. 装饰模式易于出错,调试排查比较麻烦。

五、装饰模式实际开发应用场景

  (1)IO 中输入流和输出流的设计

      a. Componen 抽象构件角色:

       IO 流中的InputStream、OutputStream、Reader、Writer

      b. ConcreteComponen 具体构件角色:

       IO 流中的FileInputStream、FileOutputStream

      c. Decorator 装饰角色:

       持有一个抽象构件的引用:IO 流中的FileInputStream、FileOutputStream

      d. ConcreteDecorator 具体装饰角色:

       负责给构件对象增加新的责任,IO 流中的BufferedInputStream、BufferedOutputStream

  (2)Swing 包中图形界面构件功能;

  (3)Servlet API 中提供了一个 request 对象的Decorator 设计模式的默认实现类,增强了 request 对象的功能;

  (4)Struts2 中,request、response、session 对象的处理; 

  (5)…………

GOF23设计模式之装饰模式(decorator)的更多相关文章

  1. 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)

    原文:乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) 作者:weba ...

  2. 【GOF23设计模式】装饰模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_装饰模式.IO流底层架构.装饰和桥接模式的区别 package com.test.decorator; /** * Com ...

  3. 二十四种设计模式:装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern) 介绍动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活.示例有一个Message实体类,某个对象对它的操作有Insert()和 ...

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

    1.模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制:使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是 ...

  5. 设计模式之装饰模式(Decorator)摘录

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/fengbingchun/article/details/29237955 23种GOF设计模式一般分 ...

  6. 设计模式 笔记 装饰模式 Decorator

    //---------------------------15/04/17---------------------------- //Decorator 装饰模式----对象结构型模式 /* 1:意 ...

  7. 结构型设计模式之装饰模式(Decorator)

    结构 意图 动态地给一个对象添加一些额外的职责.就增加功能来说,D e c o r a t o r 模式相比生成子类更为灵活. 适用性 在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. ...

  8. 设计模式之装饰模式(Decorator)

    装饰模式原理:给对象增加特性,这种特性是一种累加的效果 代码如下 #include <iostream> #include <string> #include <list ...

  9. 【设计模式】—— 装饰模式Decorator

    前言:[模式总览]——————————by xingoo 模式意图 在不改变原来类的情况下,进行扩展. 动态的给对象增加一个业务功能,就功能来说,比生成子类更方便. 应用场景 1 在不生成子类的情况下 ...

随机推荐

  1. document和javaScript内置对象

    1.Document 属性: referrer //返回载入当前文档的URL URL //返回当前文档的URL 方法: getElementById(); //根据id获取html元素对象 getEl ...

  2. mstsc Windows局域网内远程桌面连接

    1.检查被连接计算机的远程桌面连接功能是否开启  控制面板->系统和安全->系统->远程设置->远程桌面->勾选"仅允许运行使用网络级别身份验证的远程桌面的计算 ...

  3. Redis学习总结之一——Redis初入

    Redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis是一个key-value存储系统. ...

  4. java分布式(一)

    分布式架构的演进 初始阶段架构 应用服务和数据服务分离阶段 使用缓存改善性能 使用应用服务器集群 数据库读写分离 反向代理和CDN加速 分布式文件系统和分布式数据库 使用NoSql和搜索引擎 业务拆分 ...

  5. springboot项目启动之后初始化自定义配置类

    前言 今天在写项目的时候,需要再springboot项目启动之后,加载我自定义的配置类的一些方法,百度了之后特此记录下. 正文 方法有两种: 1. 创建自定义类实现 CommandLineRunner ...

  6. Roslyn 的确定性构建

    注意到每次编译完之后,你的 dll 或者 exe 是不一样的吗?本来这并没有什么大不了的,但大家都知道数字和鹅厂的安全软件遍布在我们大(tiān)陆(cháo)地区的大量电脑上,它们的查杀策略是——凡 ...

  7. 如何通过eclipse查看、阅读hadoop2.4源码

    问题导读:1.官网src包下载包,能否直接使用?2.如何跟踪和查看hadoop源码? 此篇是从零教你如何获取hadoop2.4源码并使用eclipse关联hadoop2.4源码基础上的一个继续,上文其 ...

  8. 《DSP using MATLAB》示例Example 8.12

    %% ------------------------------------------------------------------------ %% Output Info about thi ...

  9. 《DSP using MATLAB》示例Example7.14

    代码: M = 20; alpha = (M-1)/2; l = 0:M-1; wl = (2*pi/M)*l; Hrs = [1, 1, 1, zeros(1, 15), 1, 1]; % Idea ...

  10. 《DSP using MATLAB》示例Example7.8

    窗函数的设计思想就是选择一个理想的频率选择滤波器(通常其脉冲响应函数是 非因果.无限长的),然后截断(取窗)这个无限长脉冲响应,得到一个线性相位.因果的 FIR滤波器.频率域示意图如下: 我们的目的: ...