这次笔记是对装饰者模式的学习,书中用到的例子是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系统设计就是使用了装饰者模型来设计的,可以仔细研究下。
这次就到这里吧,比较粗糙这次,反思下,再有感悟补上吧。