概述:
本章可引称为“给予热爱继承的人新的设计视野”。 我们计划再次讨论典型的滥用问题。 在本章中,您将学习如何使用对象组合在运行时装饰类。 为什么呢? 一旦熟悉了装饰者的技术,就可以在不修改基本代码的情况下对你的(或其他人的)对象赋予新的责任。 —— 《Head First 设计模式》
使用环境:
我们有各种类型的东西,每个东西下面都有很多小的精细分类。 如果可以自由组合这些分类,比如一种饮料有一个主原料和几个配料,一个菜里一个主原料加几个配料,装饰一个房间等,考虑一下能否通过装饰模式来实现。 《Head First 设计模式》例星简单介绍优美的信封咖啡。
功能优势:
通过组合维护代码,可以通过动态组合对象,在不修改现有代码的情况下编写新代码来添加新功能。
思想分析:
在星星美丽的信封咖啡店里,有多种咖啡和多种调味料。 在一个咖啡里再放一个或几个配料的时候,主要是一个被装饰者和多个装饰者。 那么,这些咖啡和配料怎么收费呢(这里采用收费就是一个很好的例子。 当然,其他同样的事件也可以)。 如果说可以封装每个选项组合,那么有多少个类呢? 另一个是,如果咖啡店里咖啡或配菜的价格变动,或者需要追加新的咖啡或配菜时,该怎么办呢?
其实,本文的模式有很好的解决方案。 继承不再使用继承,因为类可能会爆炸。 让我们考虑一下,是否可以把咖啡店里的所有原料(包括主原料和所有原料)都当成一个东西(原料)。 这样,我们就可以在互相组合的过程中动态地实现一些功能。 你可能会问,为什么要把它当成一个东西,目的是让所有原料实现同样的功能,不管代码中的组合顺序如何。
类图展示:
当然,上面咖啡的四个班可以再封一级。 这里就书的内容进行了原样的输出。
代码显示:
Beverage.java
公共类beverage {
publicstringmdescription=' unknown beverage ';
私有int size=0;
公共字符串获取描述(
return mDescription;
}
公共获取(
返回大小;
}
公共void setsize (intsize ) {
this.size=size;
}
公共适配器双成本(;
}
CondimentDecorator.java
publicabstractclasscondimentdecoratorextendsbeverage {
@Override
公共双成本(
返回0;
}
publicabstractstringgetdescription (;
}
DarkRoast.java
publicclassdarkroastextendsbeverage {
private double mCost=0.99;
公共日期(例如
mDescription='Dark Roast Coffee ';
}
@Override
公共双成本(
返回成本;
}
}
Milk.java
publicclassmilkextendscondimentdecorator {
私有beverage mbeverage=null;
private double mCost=0.10;
公共密钥(beverage beverage ) {
mBeverage=beverage;
}
@Override
公共字符串获取描述(
return mBeverage.getDescription ',Milk ';
}
公共双成本(
return mCost mBeverage.cost (;
}
}
StarbuzzCoffee.java
公共类星巴克starbuzzcoffee {
publicstaticvoidmain (string [ ] args ) {
Beverage beverage=new Espresso (;
system.out.println (beverage.get description (' $ ' beverage.cost ) );
Beverage beverage2=new DarkRoast (;
beverage2=newMocha(beverage2;
beverage2=newMocha(beverage2;
beverage2=newwhip(beverage2;
system.out.println (beverage2. get description (' $ ' beverage2. cost ) );
beverage beverage3=new house blend (;
beverage3=newSoy(beverage3;
beverage3=newMocha(beverage3;
beverage3=newwhip(beverage3;
system.out.println (beverage3. get description (' $ ' beverage3. cost ) );
}
}
执行图例:
下载源代码:
3358 download.csdn.net/detail/u 013761665/8721015