一、装饰模式概述

  (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. Personal Introduction

    专业:计算机科学与技术 我是博客园的新人,虽然接触编程世界只有一年,基础知识比较差,编程能力差,但对于这个专业,我还是充满兴趣,希望有一天能独当一面,从今天起,我将分享一些在学习web前端和其他方面的 ...

  2. 01_StudentManager

    package com.dao; import java.util.ArrayList; import java.util.Iterator; import java.util.List; impor ...

  3. 浅析C#中ASP.NET页面的生存周期

    一般来说,页要经历下表概述的各个阶段.除了页生命周期阶段以外,在请求前后还存在应用程序阶段,但是这些阶段并不特定于页. 阶段 说明 页请求 页请求发生在页生命周期开始之前.用户请求页时,ASP.NET ...

  4. socket函数sendto与send的区别

    C:socket相关的sendto()函数简介 http://blog.csdn.net/flytiger_ouc/article/details/19634279 文中提到SOCK_DGRAM, S ...

  5. 从头搭建一个React应用

    node,webpack这些就不一一介绍怎么安装了,默认大家都知道. 一.npm install -g create-react-app 首先全局安装react的脚手架工具 create-react- ...

  6. 前端构建工具-fis3使用入门

    FIS3 是面向前端的工程构建工具.解决前端工程中性能优化.资源加载(异步.同步.按需.预加载.依赖管理.合并.内嵌).模块化开发.自动化工具.开发规范.代码部署等问题. 官网地址是: https:/ ...

  7. 细说并发5:Java 阻塞队列源码分析(下)

    上一篇 细说并发4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文 ...

  8. 程序设计入门-C语言基础知识-翁恺-第七周:指针与字符串-详细笔记(七)

    目录 第七周:指针与字符串 7.1 指针初步 7.2 字符类型 7.3 字符串 7.3 课后练习 第七周:指针与字符串 7.1 指针初步 sizeof 是一个运算符,给出某个类型或变量在内存中所占据的 ...

  9. BD09坐标(百度坐标) WGS84(GPS坐标) GCJ02(国测局坐标) 的相互转换

    BD09坐标(百度坐标) WGS84(GPS坐标) GCJ02(国测局坐标) 的相互转换 http://www.cnphp6.com/archives/24822 by root ⋅ Leave a ...

  10. Android编程实例-获取当前进程名字

    下面代码是根据进程id获取进程名字: /** * 根据Pid获取当前进程的名字,一般就是当前app的包名 * * @param context 上下文 * @param pid 进程的id * @re ...