首页 > 代码库 > 设计模式【装饰模式】

设计模式【装饰模式】

装饰模式(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();
	}
}


 

 

设计模式【装饰模式】