设计模式【装饰模式】

装饰模式(Decorator Pattern)
        又名包装(Wrapper)模式,装饰模式以对client透明的方式扩展对象的功能,是继承关系的一个替代方案。
 装饰模式以对client透明的方式动态的给一个对象附加上很多其它的责任。

换言之,client并不会认为对象在装饰前和装饰后有什么差别。

【转载使用,请注明出处:http://blog.csdn.net/mahoking
       装饰模式的特点是,在不创建很多其它子类的模式下,将对象的功能加以扩展。
       以下我们介绍,装饰模式与类继承的差别:

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


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


       3、 装饰模式是在不改变原类文件和使用继承的情况下,动态的扩展一个对象的功能,它是通过创建一个包装对象。也就是装饰包裹真实的对象。
装饰模式把对client的调用委派给被装饰的类,装饰模式的关键在于这样的扩展全然透明的。以下介绍装饰模式的构成。

装饰模式的构成:
       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、装饰对象和真实对象具有同样的接口。这样client对象就能够以真实的对象的同样方式和装饰对象交互。
     2、装饰对象包括一个真实对象的应用(reference)。


     3、装饰对象接受全部来自client的请求。它把这些请求转发个真实的对象。
     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();
	}
}


 【转载使用,请注明出处:http://blog.csdn.net/mahoking