设计模式笔记3(装饰者模式)

这次笔记是对装饰者模式的学习,书中用到的例子是startbuzz店的订单系统,对于每一种产品,都需要有一个价格方法。现在面临的问题是用户的咖啡可能很复杂,同一种咖啡也可能由于用户添加新的材料而引起价格的变动,总不能把所有的可能情况都设计成类,显然这是不现实的。

考虑了集中方案后都不太合适,继续阅读。

继承和组合:继承威力强大,但是使用继承的话设计的类弹性较差,维护困难。通过组合也可以起到在运行时具有继承行为的效果。前面的内容已经介绍过。这两种方式的区别在于,继承的话子类行为在编译的时候已经决定了,而且子类会有相同的方法,而使用组合则是在运行时动态的扩展,显然它的效果会好。

设计原则:类应该对扩展开放,对修改关闭

这样能达到的目的就是类容易扩展,在不修改代码的情况下,可以搭配新的行为。

采用装饰者模型,一层层的嵌入价格来达到目的。相当于把对象作为一个容器,任何一个对象都可以放入到另一对象中,允许嵌套。

利用装饰者模式实现系统:

///最顶层的类,通过它可以可以达到类型匹配的目的,而不是由子类来继承它的行为。用接口也可以起到同样的效果

public abstract class Beverage{

   String description="";

   public string getDescription()

{}

public abstract double cost()

{

}

}

//装饰者类,通过它来进一步定义各个装饰者

public abstract class CondimentDecrator extends Beverage

{

public abstract String getDescription(){};

}

//实现一些饮料类

public class Espresso extends Beverage

{

   public Espresso()

{

description="Espresso";

}

}

。。。。。。。。。。。

实现一些装饰者

public class Mocha extends CondimentDecorator

{

Beverage beverage;

public Mocha(Beverage beverage)//注意参数类型

{

   this.beverage=beverage;

}

public String getDescription()

{

   return berverage.description+"Mocha";

}

public double cost()

{

return .20+beverage.cost();

}

}

。。。。。。。。

使用的时候代码如下:

Beverage beverage =new Espresso();

beverage=new Mocha(berverage);

bererage=new Mocha(berverage);\

如果对咖啡不是很了解的话,可以这样理解,要了一杯Espresso,加了两次的Mocha

每次都放到一个杯子里,这样就把各个装饰者添加到了一块,注意代码的具体实现。

Java的io系统设计就是使用了装饰者模型来设计的,可以仔细研究下。

这次就到这里吧,比较粗糙这次,反思下,再有感悟补上吧。

原文地址:https://www.cnblogs.com/macula7/p/1960850.html