设计模式【装饰模式】

装饰模式(Decorator Pattern)

又名包装(Wrapper)模式,装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

装饰模式以对客户端透明的方式动态的给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么区别。

装饰模式的特点是,在不创建更多子类的模式下,将对象的功能加以扩展。

下面我们介绍,装饰模式与类继承的区别:

1、 装饰模式是一种动态行为,对已经存在的类进行随意组合,而类的继承是一种静态的行为,一个类定义成什么样的,该类的对象便具有什么样的功能,无法动态的改变。

2、 装饰模式扩展的是对象的功能,不需要增加类的数量,而类继承是扩展类的功能,在继承的关系中,例如,增加某个对象的功能,会通过继承的方式,在子类中增加需要的函数(方法)。

3、 装饰模式是在不改变原类文件和使用继承的情况下,动态的扩展一个对象的功能,它是通过创建一个包装对象,也就是装饰包裹真实的对象。

装饰模式把对客户端的调用委派给被装饰的类,装饰模式的关键在于这种扩展完全透明的。下面介绍装饰模式的构成。

装饰模式的构成:

1、抽象构建角色(Component),给出一个抽象的接口,以规范准备接受附加责任的对象。例如:i/o流里面InputStream/OutputStream和Reader/Writer。

2、具体的构建角色(ConcreteComponent),定义一个将要接受附加责任的类。例如:i/o里面的FileOutputStream和FileInputStream。

3、装饰角色(Docotator),持有一个抽象构建(Component)角色的引用,并定义一个与抽象构建一致的接口。例如:i/o里面的FilerOutputStream和FilterInputStream。

4、具体的装饰角色(ConcreteDecorator),负责给构建对象“贴上”附加的责任。例如:i/o流里面的BufferedOutputStream和BufferedInputStream以及DataOutputStream和DataInputSrtream。

装饰模式的特点:

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

2、装饰对象包含一个真实对象的应用(reference)。

3、装饰对象接受所有来自客户端的请求,它把这些请求转发个真实的对象。

4、装饰对象可以在转发这些请求以前或者以后增加一些附加的功能。这样就能确保在运行时,不用修改给定对象结构就可以在外部增加附加的功能。在面向对象的程序设计中,通常是使用继承的关心来扩展给指定类的功能。

示例案例

/**
 * 抽象构建角色
 * @author Mahc
 *
 */
public interface Component {

	/**
	 * 某项功能的操作
	 */
	public void function();
}

/**
 * 具体的构建角色
 * @author Mahc
 *
 */
public class ConcreteComponent implements Component{

	@Override
	public void function() {

		System.out.println("Function A");
	}

}

/**
 * 装饰角色
 * @author Mahc
 *
 */
public class Decorate implements Component {

	private Component component;

	public Decorate(Component component) {
		this.component = component;
	}

	@Override
	public void function() {

		component.function();
	}

}

/**
 * 具体的装饰角色
 * @author Mahc
 *
 */
public class ConcreteDecorator extends Decorate{

	public ConcreteDecorator(Component component) {
		super(component);
	}

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

	private void otherFunction(){
		System.out.println("otherFunction B");
	}
}

/**
 * 装饰模式测试用例
 * @author Mahc
 *
 */
public class TestDecoratorPattern {

	public static void main(String[] args) {

		ConcreteComponent component = new ConcreteComponent();
		ConcreteDecorator decorator = new ConcreteDecorator(component);
		System.out.println("真实对象(类)调用function()");
		component.function();
		System.out.println("包装对象(类)调用function()");
		decorator.function();
	}
}
时间: 2024-08-11 03:31:42

设计模式【装饰模式】的相关文章

c++设计模式----装饰模式

前言 在实际开发时,你有没有碰到过这种问题:开发一个类,封装了一个对象的核心操作,而这些操作就是客户使用该类时都会去调用的操作:而有一些非核心的操作,可能会使用,也可能不会使用:现在该怎么办呢? 将这些非核心的操作全部放到类中,这样,一个类就包含了很多核心的操作和一些看似有关,但是又无关的操作:这就会使核心类发生"爆炸"的现象,从而使核心类失去了一定的价值,也使使用核心类的客户在核心操作和非核心操作中挣扎: 使用继承来扩展核心类,需要使用核心类时,直接建立核心类对象:当需要使用核心类扩

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

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的. 设计模式学习笔记 --Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1.概念 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 但是纯粹的装饰模式很难找到,大多数的装饰模式的实现都是"半透明"的,而不是完全透明的.换言之,允许装饰模式改变接口,增加新的方法.半透明的装饰模式是介于装饰模式和适配器模式之间的.适配器模

设计模式—装饰模式和适配器模式

装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 设计模式在JAVA I/O库中的应用 装饰模式在Java语言中的最著名的应用莫过于Java I/O标准库的设计了. 由于Java I/O库需要很多性能的各种组合,如果这些性能都是用继承的方法实现的,那么每一种组合都需要一个类,这样就会造成大量性能重复的类出现. 而如果采用装饰模式,那么类的数目就会大大减少,性能的重复也可以减至最少.因此装饰模式是Java I/O库的基本模式. 适配器模

将计算机思维故事化——之设计模式装饰模式

"我要买一个装东西的袋子" --如果需要搬家里的行李,这句话可能会发生在超市里. 那么,上述提到的三个名词--"东西"."袋子"和"行李",应该是如下图关系: (1)行李,是一样东西 (2)袋子,也是一样东西 (3)袋子,可以装行李 通过以上三句话的关系,可以得出结论:第一,袋子可以装东西,虽然其本身就是一样东西:第二,装了东西的袋子,还是一样东西.所以,可以在行李的基础上,不断地套袋子,且不管加多少层,最后得到的还是一样东西

大话设计模式-装饰模式(C++)

<大话设计模式>的装饰模式的C++实现. 结构图: Decorator.h: #ifndef _DECORATOR_H #define _DECORATOR_H #include <iostream> #include <string> using namespace std; //ConcreteComponent类 class CPerson { public: CPerson(){}; CPerson(string str):m_sName(str){}; vir

小菜学设计模式——装饰模式

背景 很多时候你会发现子类在不断增加,有时候甚至难以控制,虽然继承是面向对象的一大特征,但是继承并不是项目中所提倡,合成复用设计原则就告诉我们能够使用合成的地方尽量不要使用继承.对于继承来说还有一个很大的缺点,那就是内存占用与子类的层次是成正比关系的,这个也很好理解,实例化子类的时候总是要先调用最顶层父类的构造方法,然后依次调用低层次的父类直到自身初始化,这个过程实际上是很耗内存的.那么,问题就来了,我们经常会扩展一个类的某个方法,是不是没扩展方法都有必要新增一个子类呢?答案是否定的,在某种情况

大话设计模式—装饰模式

装饰模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 大话设计模式中程杰老师给出的定义,装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活. 装饰模式结构图如下: 关键代码: 1.Component 类充当抽象角色,不应该具体实现. 2.修饰类引用和继承

Java设计模式----装饰模式

1.概念: (在我看来,模式就像是是一种思想,在这种思想的指引下,对代码和结构的一番加工和整合而已!都是套路!) 装饰模式又称包装(Wrapper)模式,是以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案.对客户端透明意味着接口不变. 2.问题: 在OO设计和开发过程中, 经常会遇到下面的情况: 我们需要为已经设计好的类添加新的职责, 通常情况下我们会定义一个新类继承自定义好的类. 由于组合比继承更好(复杂度高,继承深度深等原因, 类图: 3.如何实现装饰: (1):继承形式:(不推

设计模式--装饰模式

装饰模式用例图 class Program { static void Main(string[] args) { ConcreteComponent c = new ConcreteComponent(); ConcreteDecoratorA d1 = new ConcreteDecoratorA(); ConcreteDecoratorB d2 = new ConcreteDecoratorB(); d1.SetComponent(c); d2.SetComponent(d1); d2.O

[工作中的设计模式]装饰模式decorator

一.模式解析 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的要点主要是: 1.需要对已有对象扩展新的功能,又不希望改变原有对象接口: 2.装饰者对象与原有对象需要继承相同接口,初始化装饰对象时将原有对象传入装饰对象: 3.可以对一个对象定义多个装饰着对象,进行分别装饰或者组合装饰 二.模式代码 1.抽象接口 package decorator.patten; public interface Component { pu