《软件模式》课程论文《装饰模式应用分析》姓名:XXX学号:XXXXXXXXXXX班级:XXXXXXXXXX2017年4月16日目录1.1摘要.................................................................................................................42.1关键字..............................................................................................................43.1开发工具..........................................................................................................54.1模式定义..........................................................................................................55.1装饰模式结构...................................................................................................66.1装饰模式实例:................................................................................................76.1.1代码分析....................................................................................................86.1.1.1Phone(抽象构件)代码:.................................................................86.1.1.2ConcreteComponent(具体构件)代码:.........................................86.1.1.3(抽象装饰类)代码:.............................................................................9Changer..................................................................................................96.1.1.4(具体装饰类):...................................................................................9ComplexPhone类...................................................................................9JarPhone类..........................................................................................106.1.1.5客户端..............................................................................................116.1.1.5运行结果:.......................................................................................117.1装饰模式的优缺点..........................................................................................127.1.1优点:.....................................................................................................127.1.2缺点:.....................................................................................................128.1结论...............................................................................................................139.1参考文献:.....................................................................................................131.1摘要装饰模式是一种用于替代继承的技术,它通过一种无须定义的子类的方式来给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系,在装饰模式中引入了装饰类,在装饰类中既可以调用被装饰类的方法,还可以定义新的方法,以便扩充类的功能。装饰模式降低了系统的耦合度,可以动态增加或删除对象的职责,并使得需要装饰的具体构件类和具体装饰类可以独立变化,增加新的具体构件类和具体装饰类都非常方便,满足“开闭原则”的要求。2.1关键字面向对象;java接口;接口编程;装饰模式。3.1开发工具Eclipsejava语言开发4.1模式定义动态的给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。英文定义“Attachadditionalresponsibilitytoanobjectdynamically.DecoratorsprovideAflexiblealternativetosubclassingforextendingfunctionlity”5.1装饰模式结构a、Component(抽象构件)抽象构件定义了对象的接口,可以给这些对象动态增加职责(方法)。抽象构件是具体构件和抽象装饰类的共同父类,它声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的方式处理未被装饰的对象以及装饰之后的对象,实现客户端的透明操作。b、ConcreteComponent(具体构件)具体构件定义了具体的构件对象,实现了在抽象构件中声明的方法,装饰器可以给他增加额外的职责。c、Decorator(抽象装饰类)抽象装饰类是抽象构件类的子类,用于给具体构件增加职责,但是具体职责在其子类中实现。它维护一个指向抽象构件对象的引用,通过该引用可以调用装饰之前构件对象的方法,并通过其子类扩展该方法,以达到装饰的目的。D、ConcreteDecorator(具体装饰类)具体装饰类是抽象装饰类的子类,负责向构件添加新的职责,每一个具体装饰类都定义了一些新的行为,它可以调用在抽象装饰类中定义方法,并可以增加新的方法以便扩充对象的行为。6.1装饰模式实例:简单的手机(SimplePhone)在接收到来电的时候,会发出声音来提醒主人;而现在我们需要为该手机添加一项功能,在接收来电的时候,除了有声音还能产生振动(JarPhone);还可以得到更加高级的手机(ComplexPhone),来电时它不仅能够发出声,产生振动,而且还有闪关灯提示,现用装饰模式来模拟手机功能的升级过程。6.1.1代码分析6.1.1.1Phone(抽象构件)代码:packageXK_Phone;publicabstractclassPhone{publicabstractvoidvoice();}6.1.1.2ConcreteComponent(具体构件)代码://构件类publicclassSimplePhoneextendsPhone{publicSimplePhone(){System.out.println(这是一部简单手机!!!);}publicvoidvoice(){//TODOAuto-generatedmethodstubSystem.out.println(手机来电声音!!!);}}6.1.1.3(抽象装饰类)代码:ChangerpublicclassChangerextendsPhone{privatePhonephone;publicChanger(Phonephone){this.phone=phone;}@Overridepublicvoidvoice(){//TODOAuto-generatedmethodstubphone.voice();}}6.1.1.4(具体装饰类):ComplexPhone类//关联JarPhone类publicclassComplexPhoneextendsChanger{publicComplexPhone(Phonephone){super(phone);System.out.println(变成高级手机!);flash();}publicvoidflash(){System.out.println(手机来电闪烁灯光提示!!!);}}JarPhone类publicfinalclassJarPhoneextendsChanger{publicJarPhone(Phonephone){super(phone);//TODOAuto-generatedconstructorstubSystem.out.println(手机增加振动功能!);}publicvoidvoice(){super.voice();System.out.println(来电振动!);}}6.1.1.5客户端//客户类publicclassClient{publicstaticvoidmain(Stringarg[]){Phonep1=newSimplePhone();//父类调用子类方法p1.voice();System.out.println(***********);Phonep2=newJarPhone(p1);p2.voice();System.out.println(***********);Phonep3=newComplexPhone(p2);p3.voice();}}6.1.1.5运行结果:7.1装饰模式的优缺点7.1.1优点:1、装饰者模式可以提供比继承更多的灵活性2、可以通过一种动态的方式来扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为。3、通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。4、具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。7.1.2缺点:1、会产生很多的小对象,增加了系统的复杂性2、这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。8.1结论1、组合和委托可以在运行时动态的添加新的行为,而继承是静态的,在系统编译时就已经决定了对象的行为。2、装饰者模式意味着一群装饰者类,这些类用来包装具体组件3、装饰者可以在被装饰者的行为前面或者后面加上自己的行为,甚至可以将被装饰者的行为整个取代掉,从而达到特定的目的。4、可以用多个装饰者包