预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

HYPERLINK"http://www.cnblogs.com/chenssy/archive/2013/05/23/3094138.html"设计模式读书笔记-----装饰者模式 我们都知道,可以使用两种方式给一个类或者对象添加行为。 一是使用继承。继承是给一个类添加行为的比较有效的途径。通过使用继承,可以使得子类在拥有自身方法的同时,还可以拥有父类的方法。但是使用继承是静态的,在编译的时候就已经决定了子类的行为,我们不便于控制增加行为的方式和时机。 二是使用关联。组合即将一个对象嵌入到另一个对象中,由另一个对象来决定是否引用该对象来扩展自己的行为。这是一种动态的方式,我们可以在应用程序中动态的控制。 与继承相比,关联关系的优势就在于不会破坏类的封装性,且具有较好的松耦合性,可以使系统更加容易维护。但是它的缺点就在于要创建比继承更多的对象。 一、基本定义 装饰者模式,动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。 二、模式结构 装饰者模式UML结构图。 Component:抽象构件。是定义一个对象接口,可以给这些对象动态地添加职责。 ConcreteComponent:具体构件。是定义了一个具体的对象,也可以给这个对象添加一些职责。 Decorator:抽象装饰类。是装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator存在的。 ConcreteDecorator:具体装饰类,起到给Component添加职责的功能。 三、实现装饰者模式 情景模式:星巴兹以扩张速度快而闻名。在里面购买咖啡时,可以要求在其中加入各种调料,星巴兹会根据所加入的调料收取不同的费用,也就是说不同的咖啡与调料之间有N多不同的组合方式。每种咖啡和调料都有不同的收费。如果这个时候我们使用继承方式,则会陷入无以复加的地步。这里会有N多个类,出现“类爆炸”现象。 结构图如下: 装饰者模式提供了一个比较好的解决方案。 编码实现: ComponentBeverage.java 1publicabstractclassBeverage{ 2protectedStringdescription="UnknownBeverage"; 3 4publicStringgetDescription(){ 5returndescription; 6} 7 8publicabstractdoublecost(); 9} 四个组件:HouseBlend.java 1publicclassHouseBlendextendsBeverage{ 2 3publicHouseBlend(){ 4description="HouseBlend"; 5} 6 7@Override 8publicdoublecost(){ 9return0.89; 10} 11 12} DarkRoast.java 1publicclassDarkRoastextendsBeverage{ 2publicDarkRoast(){ 3description="DarkRoast"; 4} 5@Override 6publicdoublecost(){ 7return1.05; 8} 9 10} Espresso.java 1publicclassDarkRoastextendsBeverage{ 2publicDarkRoast(){ 3description="DarkRoast"; 4} 5@Override 6publicdoublecost(){ 7return1.05; 8} 9 10} Decat.java 1publicclassDecatextendsBeverage{ 2publicDecat(){ 3description="Decat"; 4} 5 6@Override 7publicdoublecost(){ 8return0.99; 9} 10 11} CondimentDecorator.java 1publicabstractclassCondimentDecoratorextendsBeverage{ 2publicabstractStringgetDescription(); 3} Milk.java 1publicclassMilkextendsCondimentDecorator{ 2Beveragebeverage; 3 4publicMilk(Beveragebeverage){ 5this.beverage=beverage; 6} 7 8@Override 9publicStringgetDescrip