首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计形式—装饰者模式

2012-08-10 
设计模式—装饰者模式通过继承实现子类的行为是在编译时静态决定的,而且所有子类都会继承到相同的行为而组

设计模式—装饰者模式

通过继承实现子类的行为是在编译时静态决定的,而且所有子类都会继承到相同的行为;而组合可以在运行时动态的进行扩展,所以应该尽量利用组合的方法扩展对象的行为。运行时的扩展远比编译时期的继承威力大

??? 1? 装饰者和被装饰者必须是一样的类型,即具有共同的超类。
??? 2? 当我们将装饰者与组件组合时,就是在加入新的行为。
??? 3? java I/O中使用了大量的装饰类
??? 4? 装饰者模式符合开放——关闭模式:允许扩展,但是不允许修改代码。


//超类package com.quding.mode;public abstract class Beverage {private String description = "unknown description";public String getDescription(){return description;}public abstract double cost();}//装饰者超类package com.quding.mode;public abstract class Decorator extends Beverage{public abstract String getDescription();}


//具体的子类:

package com.quding.mode;public class Coffee1 extends Beverage{@Overridepublic double cost() {return 2.0;    //coffee1 价格2元}@Overridepublic String getDescription() {return "coffee1";}}//子类2package com.quding.mode;public class Coffee2 extends Beverage{@Overridepublic double cost() {return 4.0;    //coffee2 价格4元}@Overridepublic String getDescription() {return "coffee2";}}

?装饰者子类:

package com.quding.mode;public class MilkDecorator extends Decorator {private Beverage mBeverage;public MilkDecorator(Beverage mBeverage) {super();this.mBeverage = mBeverage;}@Overridepublic String getDescription() {return mBeverage.getDescription() + " , milk";}@Overridepublic double cost() {return mBeverage.cost() + 1;   //加牛奶一元}}//子类2package com.quding.mode;public class SugarDecorator extends Decorator {private Beverage mBeverage;public SugarDecorator(Beverage mBeverage) {super();this.mBeverage = mBeverage;}@Overridepublic String getDescription() {return mBeverage.getDescription() + " , sugar";}@Overridepublic double cost() {return mBeverage.cost() + 2;   //加糖二元}}

?测试代码:

package com.quding.mode;public class MainTest {public static void main(String[] args) {System.out.println("要一份加糖的种类为coffee1的咖啡:");Beverage beverage = new SugarDecorator(new Coffee1());System.out.println("种类 : " + beverage.getDescription() + "\n价格 : "+ beverage.cost());System.out.println("要一份加糖加两份牛奶的种类为coffee2的咖啡:");beverage = new SugarDecorator(new MilkDecorator(new MilkDecorator(new Coffee2())));System.out.println("种类 : " + beverage.getDescription() + "\n价格 : "+ beverage.cost());}}

?

总结:以上简单的几个类体现了装饰者模式的精髓。以后当使用继承时要考虑能否使用装饰者代替,扩展代码的弹性。

热点排行