装饰模式(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】