输出:
网络存储:数据 存储到网络存储:数据 存储到文件本地存储:数据 存储到本地存储:数据 存储到文件
而且这个程序是很容易扩展的,直接添加细化抽象和具体实现就可以了。
23、装饰模式(Decorator Pattern)
别名:包装器(Wrapper)
动态的给对象添加额外的职责。就功能来说,装饰模式比生产子类更为灵活。
何时使用
程序希望动态的增强类的某对对象的功能,而不影响其他对象时 采用继承来增强对象功能不利于系统的扩展和维护时
优点
被装饰者和装饰者是松耦合关系。 满足开-闭原则 可以使用多个具体装饰器装饰具体组件的实例
装饰模式使用被装饰类的一个子类的实例,把客户端的调用委派到被装饰类,装饰模式的关键在于这种扩展是完全透明的。装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为。
例如,我们有一个工具,用于持久化数据的,最开始设计的功能时是将数据持久化到本地文件,但现在部分数据需要同时持久化到,再后来,又有数据需要同时持久化到网络上的位置,而我们是不能改之前的实现的,因为后面这些需求,只是针对部分数据的,所以我们理所当然就可以使用装饰器模式了。
数据持久化接口(抽象组件)如下:
//被装饰者接口public intece IPersistentUtil { void persistentMsg(String msg);}
其最初的实现(具体组件)如下:
//具体的被装饰者public class PersistentUtil implements IPersistentUtil{ @Override public void persistentMsg(String msg) { System.out.println(msg " 存入文件"); }}
首先需要抽象一个装饰器,我们不能直接使用它(即使使用匿名内部类使用了它,也跟最初的实现效果一样,没有意义),因为他是一个抽象类(装饰):
//装饰public abstract class PersistentDecorator implements IPersistentUtil { IPersistentUtil iPersistentUtil; public PersistentDecorator(IPersistentUtil iPersistentUtil){ this.iPersistentUtil = iPersistentUtil; } @Override public void persistentMsg(String msg) { iPersistentUtil.persistentMsg(msg); }}
然后,我们添加一个装饰器,可以同时实现数据持久化到(具体装饰):
//装饰--存入public class PersistentDbDecorator extends PersistentDecorator { public PersistentDbDecorator(IPersistentUtil iPersistentUtil){ super(iPersistentUtil); } @Override public void persistentMsg(String msg) { iPersistentUtil.persistentMsg(msg); persistentToDb(msg); } private void persistentToDb(String msg){ System.out.println(msg " 存入"); }}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33893-46.html
朝鲜人民认为他们是世界上最幸福的人