一、装饰模式概述

  (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. navicat for mysql 导入SQL Server显示中文乱码解决办法

    解决方法是在navicat里右击一个连接,选择连接属性,切换到高级选项卡,去掉“使用mysql字符集”前的对勾,在编码里选择utf-8

  2. 同一主机,不同域名绑定不同网站(IIS主机头实现方法)

    说明: 网站A域名:www.weba.com 网站A路径:D:\website\weba 网站B域名:www.webb.com 网站B路径:D:\website\webb 公用主机IP:111.222 ...

  3. Html5的Web存储和WebSql

    HTML5 Web 存储 使用HTML5可以在本地存储用户的浏览数据. 早些时候,本地存储使用的是cookies.但是Web 存储需要更加的安全与快速. 这些数据不会被保存在服务器上,但是这些数据只用 ...

  4. Skynet服务器框架(九) snax框架

    什么是 snax 由于 skynet 的 API 还是比较偏底层,为简化服务的编写提供一套简单的 API ,便有了这套 snax 框架,解决的问题: "编写一个 skynet 内部服务,处理 ...

  5. [AOP] 7. 一些自定义的Aspect - Circuit Breaker

    Circuit Breaker(断路器)模式 关于断路器模式是在微服务架构/远程调用环境下经常被使用到的一个模式.它的作用一言以蔽之就是提高系统的可用性,在出现的问题通过服务降级的手段来保证系统的整体 ...

  6. Linux 大文件的分割与合并

    1.分割 -- split命令 可以指定按行数分割和按字节大小分割两种模式. (1) 按行数分割 $ large_file.txt new_file_prefix 加上-d,使用数字后缀:加上--ve ...

  7. 拦截器springmvc防止表单重复提交【3】3秒后自动跳回首页【重点明白如何跳转到各自需要的页面没有实现 但是有思路】

    [1]定义异常类 [重点]:异常类有个多参数的构造函数public CmsException(String s, String... args),可以用来接受多个参数:如(“异常信息”,“几秒跳转”, ...

  8. 一些Fibonacci数列的神奇性质【数学】

    递推式: \(f_i=1 (1\leq i\leq 2)\) \(f_i=f_{i-1}+f_{i-2}(i>2)\) 一些性质 \(\sum_{i=1}^n f_i=f_{n+2}-1\) \ ...

  9. Postman 上传文件

    一.选择post请求方式,输入请求地址 二.填写Headers Key:Content-Type Value:multipart/form-data 三.填写body 选择form-data 然后选择 ...

  10. java面试题08

    1.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1 = 1; s1 = s1 + 1;编译时错误.对于shor ...