设计模式-装饰器模式(Decrator Model)

文 / vincentzh

原文连接:http://www.cnblogs.com/vincentzh/p/6057666.html

目录

  1. 1、概述
  2. 2、目的
  3. 3、结构组成
  4. 4、实现
  5. 5、总结

1、概述

  装饰器模式在不改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。通常给一个对象添加功能,要么在类中直接进行修改,要么通过子类继承来扩展对象的功能,又或者使用装饰模式将相应的功能进行任意的组合,使功能的扩展变的具有灵活性和动态性。装饰模式是通过创建一个包装对象,也就是装饰来包裹真实的对象,给真实对象扩展包装对象所具有的功能。

2、目的

  装饰器的目的是:通过装饰对象的任意组合,对真实对象进行功能包装,实现对象功能扩展的动态性、简便性、复用性、灵活性。

3、结构组成

  装饰模式主要涉及到四个角色:抽象主题角色、具体主题角色、抽象装饰角色、具体装饰角色

  抽象主题角色:抽象主题角色提供具体角色和抽象装饰角色共同实现的功能(基本功能方法),具体主题角色和抽象装饰角色都必须去实现抽象主题角色定义的方法;

  具体主题角色:具体主题角色就是装饰模式中的真实对象类,实现抽象主题角色的方法(基本功能方法),通过具体装饰角色包装给该角色添加附加功能;

  抽象装饰角色:所有装饰器的父类,实现了抽象主题角色的功能(主要是为了实现装饰器功能的复用,即具体的装饰器A可以装饰另外一个具体的装饰器B,因为装饰器类也是一个抽象主题角色),并持有一个抽象主题角色的对象,该对象其实就是被装饰的对象。如果不继承组件接口类,则只能为某个组件添加单一的功能,即装饰器对象不能在装饰其他的装饰器对象。

  具体装饰角色:具体的装饰器类,实现具体要向被装饰对象添加的功能。用来装饰具体的组件对象或者另外一个具体的装饰器对象。

4、实现

  抽象主题角色

1 package com.cnblogs.vincentzh.decoratormodel;
2 // 抽象主题角色
3 // 只定义基本功能方法
4 public interface Component
5 {
6     public void function();
7 }

  具体主题角色

 1 package com.cnblogs.vincentzh.decoratormodel;
 2 // 具体主题角色
 3 public class ConcreteComponent implements Component
 4 {
 5     @Override
 6     public void function()
 7     {
 8         baseFunction();
 9     }
10
11     public void baseFunction()
12     {
13         System.out.println("基础功能");
14     }
15 }

  抽象装饰角色

 1 package com.cnblogs.vincentzh.decoratormodel;
 2 // 抽象装饰角色
 3 public class Decorator implements Component
 4 {
 5     private Component component; // 持有抽象主题的角色
 6
 7     public Decorator(Component component)
 8     {
 9         this.component = component;
10     }
11
12     @Override
13     public void function()
14     {
15         component.function();
16     }
17 }

  两个具体装饰角色

 1 package com.cnblogs.vincentzh.decoratormodel;
 2 // 具体装饰角色A
 3 public class ConcreteDecoratorA extends Decorator
 4 {
 5     public ConcreteDecoratorA(Component component)
 6     {
 7         super(component);
 8     }
 9
10     @Override
11     public void function()
12     {
13         super.function();
14         functionA();
15     }
16
17     public void functionA()
18     {
19         System.out.println("附加功能A");
20     }
21 }
package com.cnblogs.vincentzh.decoratormodel;
// 具体装饰角色B
public class ConcreteDecoratorB extends Decorator
{
    public ConcreteDecoratorB(Component component)
    {
        super(component);
    }

    @Override
    public void function()
    {
        super.function();
        functionB();
    }

    public void functionB()
    {
        System.out.println("附加功能B");
    }
}

  客户端

 1 package com.cnblogs.vincentzh.decoratormodel;
 2 // 客户端测试类
 3 public class Client
 4 {
 5     public static void main(String[] args)
 6     {
 7         Component component = new ConcreteComponent();
 8         Component decoratorA = new ConcreteDecoratorA(component);
 9         Component decoratorB = new ConcreteDecoratorB(decoratorA);
10
11         decoratorB.function();
12         // 调用 decoratorB 的 function 方法时,会去先执行父类 Decorator 的 function 方法,而
13         // Decorator 中持有 Component 的对象引用(所有的被装饰类和装饰类都实现了Component),
14         // 会去调用传入 Component 引用对象的 function 方法,此处 decoratorB 执行时会先执行
15         // decoratorA 的方法,而 decoratorA 执行时 又会先去执行 component 的 function 方法,传
16         // 入的是哪个装饰器的或真实对象的引用就会去先执行引用对象下的方法,这也就是装饰器能够
17         // 随意组合的缘由所在。
18     }
19 }

  执行结果

5、总结

  Java 的 I/O 流中就是使用了装饰模式I/O流可以划分为节点流和过滤流。,

 节点流:就是直接与输入/输出设备或者文件系统打交道的基本类,如:FileInputStream、FileOutputStream等;

 过滤流:过滤过滤,就是对已有的输入/输出流进行相应的附加处理,如缓冲读/写(BufferedInputStream、BufferedOutputStream)等;

  InputStream 和 OutputStream 是所有输入/输出流的父类,它就是装饰模式中所谓的抽象主题角色(Component);而属于节点流的类自然就是具体主题角色(ConcreteComponent),它们负责与硬件或文件系统交互,形成最基本的读写操作流;FilterInputStream 和 FilterrOutputStream 则是所有过滤流的父类,同时它也继承自 InputStream 和 OutputStream,对应上去就是抽象装饰角色(Decorator);剩下具体的过滤流就是具体装饰角色(ConcreteDecorator),它对负责基本功能的节点流进行包装添加功能,如:BufferInputStream 添加缓冲读取功能。

  在 Hadoop 的编程模型中,MapReduce 用于 HDFS 文件数据读取的两个基本类 FSDataInputStream 和 FSDataOutputStream 也是继承自 Java 的 FilterInputStream 和 FilterOutputStream,那么这样来看,用于 HDFS 文件读/写的原理也是与一般文件读/写的原理并无差别,只是在原有的文件读/写基础上进行了分布式文件读取功能的添加。

时间: 2024-10-28 19:35:14

设计模式-装饰器模式(Decrator Model)的相关文章

说说设计模式~装饰器模式(Decorator)

装饰器模式,也叫又叫装饰者模式,顾名思义,将一个对象进行包裹,包装,让它变成一个比较满意的对象,这种模式在我们平时项目开发中,经常会用到,事实上,它是处理问题的一种技巧,也很好的扩展了程序,让程序代码不那么死板! 何时能用到它? 1. 需要扩展一个类的功能,或给一个类添加附加职责. 2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销. 3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实. 4. 当不能采用生成子类的方法进行扩充时. 其中我们认为第四种

PHP设计模式-装饰器模式

1.概念: 装饰器模式又叫做装饰者模式,是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.传统的编程模式都是子类继承父类实现方法的重载,使用装饰器模式,只需添加一个新的装饰器对象,更加灵活,避免类数目和层次过多. 2.角色: Component(被装饰对象基类):定义一个对象接口,以规范准备接受附加责任的对象. ConcreteComponent(具体被装饰对象):具体组件角色,即将要被装饰增加功能的类. Decorator(装饰者基类):装饰器接口. ConcreteDecor

设计模式-装饰器模式

前言 点击查看:设计模式系列 装饰器模式(Decorator) 定义:不通过派生类增改类属性动作,而是通过模式设计动态的达到这种效果,而且比继承更方便灵活减少程序的复杂性. 举例: 汪峰打造冠军团队. 首先团队类为空,经过汪峰不断的努力,为团队争取学员,也为团队队员打造合适的平台,让其发挥. 团队不断的变强,变完整,是由装饰者,根据不同的需求,给基类进行增改,一致最后赢得你的赞同,满足你的需求. 实现装配器模式的类图: 战队组建代码 //汪峰战队 abstract class WangFengT

java设计模式----装饰器模式

Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样.因此,装饰器模式具有如下的特征: 它必须具有一个装饰的对象. 它必须拥有与被装饰对象相同的接口. 它可以给被装饰对象添加额外的功能. 用一句话总结就是:保持接口,增强性能. 装饰器通过包装一个装饰对象来扩展其功能,而又不改变其接口,这实际上是基于对象的适配器模式的一种变种.它与对象的适配器模式的异同点如下. 相同点:都拥有一个目标对象. 不同点:适配器模式需要实现另外一个接口,而装饰器模式必须实

设计模式—装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀. 何时使用:在不想增加

设计模式 —— 装饰器模式(Decorator Pattern)

装饰器模式(Decorator Pattern) 概念 装饰器模式 允许向一个现有的对象添加新的功能,同时又不改变其结构.装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,以达到特定的目的. 组成 装饰器模式由组件和装饰者组成. 抽象组件(Component):需要装饰的抽象对象. 具体组件(ConcreteComponent):是我们需要装饰的对象 抽象装饰类(Decorator):内含指向抽象组件的引用及装饰者共有的方法. 具体装饰类(ConcreteDecorator):被装饰的对

.net设计模式-装饰器模式

结构型设计模式:关注类与类之间的关系 装饰器模式:用组合+继承的方式对类作出扩展,可以动态为类型添加功能,甚至调整功能顺序,不修改业务类: 一个抽象类 1 public abstract class AbstractStudent 2 { 3 public int Id { get; set; } 4 public string Name { get; set; } 5 6 public abstract void Study(); 7 } 组合+继承该抽象类 1 public class Ba

设计模式——装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 装饰器模式结构图 Component(抽象构件):它是装饰类和具体构件的公共父类(一般是接口或者抽象类): ConcreteComponent(具体构件):具它是抽象构件对象的子类,用来定义具体的构件对象(Component的子类或者具体实现): Decorator(抽象装饰类):进继承抽象构件,用于给具体的构件添加一些新的职责(一

PHP设计模式——装饰器模式

<?php /** * 装饰器模式 * 如果已有对象的部分内容或功能发生变化,但是不需要修改原始对象的结构,应使用装饰器模式 * * 为了在不修改对象结构的前提下对现有对象的内容或功能稍加修改,应使用装饰器模式 */ class Base{ protected $_content; public function __construct($content) { $this->_content = $content; } public function edit() { return $this