装饰模式

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

LOGO装饰模式——20130628COMPANYLOGO简介装饰模式:装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰模式是一种结构型模式,它主要是解决:“过度地使用了继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀(多继承)。COMPANYLOGO装饰模式的特点装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。装饰对象包含一个真实对象的索(reference)。装饰对象接受所有的来自客户端的请求。它把这些请求转发给真实的对象。装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。COMPANYLOGO模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。2.通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。3.把类中的装饰功能从类中搬移出去,这样可以简化原有的类。有效地把类的核心功能和装饰功能区分开了。COMPANYLOGO这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。2.装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。3.装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。COMPANYLOGO继承装饰模式用来扩展特定对象的功能不需要子类动态地运行时分配职责防止由于子类而导致的复杂和混乱更多的灵活性继承用来扩展一类对象的功能需要子类静态地编译时分派职责导致很多子类产生,在一些场合,报漏类的层次缺乏灵活性COMPANYLOGO装饰模式注意事项使用装饰者模式的时候需要注意一下几点内容:(1)装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。(2)装饰对象包含一个真实对象的引用。(3)装饰对象接受所有的来自客户端的请求,它把这些请求转发给真实的对象。(4)装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。然而,装饰者模式,不需要子类可以在应用程序运行时,动态扩展功能,更加方便、灵活。COMPANYLOGO需要扩展一个类的功能,或给一个类添加附加职责。2.需要动态的给一个对象添加功能,这些功能可以再动态的撤销。3.需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。4.当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。已经开发完毕的对象,后期由于业务需要,对旧的对象需要扩展特别多的功能,这时候使用给对象动态地添加新的状态或者行为(即装饰模式)方法,而不是使用子类静态继承。COMPANYLOGO类图《interface》Component+Option()ConcreteComponent+Option()Decorator+Option()DecoratorB+Option()+AddDptionB()DecoratorA+Option()+AddDptionA()COMPANYLOGO装饰模式中的角色在装饰模式中的各个角色有:(1)抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。(2)具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。(3)装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。(4)具体装饰(ConcreteDecorator)角色:负责给构件对象添加上附加的责任。COMPANYLOGO:定义一个对象接口,可以给这些对象动态地添加职责。publicinterfaceComponent{voidoperation();}COMPANYLOGO:定义一个对象,可以给这个对象添加一些职责。publicclassConcreteComponentimplementsComponent{publicvoidoperation(){//Writeyourcodehere}}COMPANYLOGO:维持一个指向Component对象的引用,并定义一个与Component接口一致的接口。publicclassDecoratorimplementsComponent{privateComponentcomponent;publicDecorator(Componentcomponent){this.component=component;}publicvoidoperation(){component.operation();}}COMPANYLOGO:在ConcreteComponent的行为之前或之后,加上自己的行为,以“贴上”附加的职责。publicclassConcreteDecoratorextendsDecorator{publicvoidoperation(){//addBehavior也可以在前面super.operation();addBehavior();}privatevoidaddBehavior(){//yourcode}}COMPANYLOGO接口时,可以让Decorator继承ConcreteComponent。2.如果只有一个ConcreteDecorator类时,可以将Decorator和ConcreteDecorator合并。COMPANYLOGO、假若有一个对象A,实现了一个a1的方法,而C1对象想要来扩展A的功能,给它增加一个c11的方法,那么一个方案是继承(见程序);另外一个方案就是使用对象组合(装饰模式),怎么组合呢?就是在C1对象里面不再继承A对象了,而是去组合使用A对象的实例,通过转调A对象的功能来实现A对象已有的功能,写个新的对象C2来示范2、TestA.Java假定是一个现有的或者第三方的功能,因某种原因我们不能直接修改,它提供了一个sayMsg()的方法,而我们现在要做的是想在它的sayMsg()方法中增加一些我们想额外输出的内容,于是我们重写了一个Decorator.java类。MailTest.java是客户端测试程序。COMPANYLOGO***抽象接口类*/publicinterfaceItestA{publicStringsayMsg();}COMPANYLOGO***具体类*/publicclassTestAimplementsItestA{publicStringsayMsg(){returnhello;}}COMPANYLOGO*具体装饰类,只有一个装饰对象的情况,装饰类和具体装饰类合并*/publicclassDecorator1implementsItestA{privateItestAitestA;publicDecorator1(ItestAitestA){this.itestA=itestA;}publicStringsayMsg(){return##1+itestA.sayMsg()+##1;}}COMPANYLOGO*具体装饰类2*/publicclassDecorator2implementsItestA{privateItestAitestA;publicDecorator2(ItestAitestA){this.itestA=itestA;}publicStringsayMsg(){return##2+itestA.sayMsg()+##2;}}COMPANYLOGO*测试类*/publicclassMailTest{publicstaticvoidmain(String[]args){ItestAtestOne=newTestA();ItestAdecorator1=newDecorator1(testOne);ItestAdecorator2=newDecorator2(decorator1);System.out.println(decorator2.sayMsg());}}装饰者其实就是给对象穿马甲,多穿一层就多加一点功能COMPANYLOGO总结装饰模式,给一个对象动态添加额外职责,这些职责需要由用户决定加入的方式和时机。装饰模式提供了“即插即用”的方式,在运行期间决定何时增加何种功能。就增加功能来说,装饰模式比生成子类更加灵活。LOGO

1 / 24
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功