首页 > 代码库 > 装饰器模式
装饰器模式
概念:
在装饰模式中的角色有:
● 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
● 具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。
● 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
● 具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。它都有具体构件角色的一个对象引用
运行测试类的结果:
需求分析!
界面设计!
码农难道每天只是加班敲代码,难道就没有其他的事情做了吗?,错了,看看我的上面和下面,还有很多没写
与客户沟通,哪些地方还需要修改!
示例:
Person类
package designMode.decorator;/** * @Package designMode.decorator * @ClassName: Person * @Description: TODO(人:接口或抽象类 ) 抽象构件角色 * @author andy * @date 2014-8-21 下午3:46:56 */public interface Person { void working();}
CodingFarmer
package designMode.decorator;/** * @Package designMode.decorator * @ClassName: CodingFarmer * @Description: TODO(码农:具体需要装饰的类) 具体构件角色 * @author andy * @date 2014-8-21 下午3:48:38 */public class CodingFarmer implements Person { public void working() { System.out.println("码农难道每天只是加班敲代码,难道就没有其他的事情做了吗?,错了,看看我的上面和下面,还有很多没写"); }}
Everyman
package designMode.decorator;/** * @Package designMode.decorator * @ClassName: Everyman * @Description: TODO(普通人:装饰器) 装饰角色 * @author andy * @date 2014-8-21 下午3:52:06 */public abstract class Everyman implements Person { public abstract void working() ;}
AnalysisDesigner
package designMode.decorator;/** * @Package designMode.decorator * @ClassName: AnalysisDesigner * @Description: TODO(需求分析师)具体装饰角色 * @author andy * @date 2014-8-21 下午4:02:15 */public class AnalysisDesigner extends Everyman { private Person person; public AnalysisDesigner(Person person){ this.person = person; } public void working() { doDemandAnalysis(); person.working(); } private void doDemandAnalysis() { System.out.println("需求分析!"); }}
WebDesigner
package designMode.decorator;/** * @Package designMode.decorator * @ClassName: WebDesigner * @Description: TODO(网页设计师)具体装饰角色 * @author andy * @date 2014-8-21 下午3:58:44 */public class WebDesigner extends Everyman { private Person person; public WebDesigner(Person person){ this.person = person; } public void working() { doUIDesign(); person.working(); } private void doUIDesign() { System.out.println("界面设计!"); }}
Sales
package designMode.decorator;/** * @Package designMode.decorator * @ClassName: Sales * @Description: TODO(商务销售) 具体装饰角色 * @author andy * @date 2014-8-21 下午4:05:44 */public class Sales extends Everyman { private Person person; public Sales(Person person){ this.person = person; } public void working() { person.working(); doTalk(); } private void doTalk() { System.out.println("与客户沟通,哪些地方还需要修改!"); }}
MainTest
package designMode.decorator;/** * @Package designMode.decorator * * @ClassName: MainTest * * @Description: TODO(这里用一句话描述这个类的作用) * * @author andy * * @date 2014-8-21 下午02:48:22 */public class MainTest { public static void main(String[] args) { Person person = new CodingFarmer(); person = new WebDesigner(person); person = new AnalysisDesigner(person); person = new Sales(person); person.working(); }}
什么时候使用,网上都是这样说:
1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
2.处理那些可以撤销的职责
3.当不能采用生成子类的方式进行扩充时
个人感觉记住它被实际应用的地方比较实在,装饰器模式在如Java I/O的类库,还有lucene切词器、过滤器都有广泛巧妙的应用,记概念我感觉不靠谱,就像数据结构的知识,一定要结合它的实际用处和自己理解之后的简单通俗易懂的例子,如果没有弄明白,很快就会忘记,下次又要花费更多的时间去理解记忆!
TokenStream :Person 抽象构件角色
Tokenizer :CodingFarmer 具体构件角色(不过它这里是抽取的类,具体就有许多需要被装饰的类,而我这边只有一个需要装饰的类,所以是一个具体的类)
TokenFilter:Everyman 装饰角色 (所以每个类都有TokenStream实际对象的引用)
StandardFilter:WebDesigner 具体装饰角色
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。