首页 > 代码库 > Design Model---Decorator Model

Design Model---Decorator Model

学习的第二个设计模式,当你设计的类图出现了类爆炸就应该考虑类的设计是否有问题,是否需要用装饰模式来修改。先来看看装饰模式的定义:(wiki)

通过使用修饰模式,可以在运行时扩充一个类的功能。原理是:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口。修饰模式是类继承的另外一种选择。类继承在编译时候增加行为,而装饰模式是在运行时增加行为。动态地去扩充一个类的功能,这是装饰模式的优点,缺点是会产生很多小的修饰类,这会造成开发人员学习的困难,比如JAVA中的JDK的FileInputStream类族。

修饰模式有一个共同的抽象类,这样经过修饰的类和未被修饰的类就可以有共同的接口,所以引用接口不会变,这是修饰模式设计中需要注意的一点。

应用场景:星巴克开发的例子,一杯咖啡可以有好几种的咖啡,A,B,C三类咖啡,那么A,B,C这三个类可以有一个抽象类作为基类Base。修饰类型也有很多种,那么可不可以直接从Base类继承而来呢??

      图片摘自Head First Design Model

样例中是从Base类中派生出一个DecorateBase类来,所有的修饰类再从DecorateBase中派生出来。在DecorateBase类中把getDescription方法声明为抽象方法。

这里对设计模式的一个简单复述:http://hiqianjin.com/blog/259

借此,在java中队抽象类的声明有两种方法,一种是接口,一种是abstract class。

abstract本质上市"is-a"关系,interface本质上市“like-a"关系

abstract classs本质上是子类需要通过继承的方式来实现,本质上子类和父类本质上市相同的,interface则是子类实现,可以有多个接口。

abstract class可以声明变量,但是interface class不可以,如果需要声明,那么必须声明为final static也就是这个变量需要

abstract class可以声明为抽象方法,也可以不是抽象方法,可以有自己的类内实体,interface则不可以,只能声明行数方法,不能有具体实现。()

可以说interface是abstract class的一个特例。关于interface和abstact class的异同可以我的收藏文章中查看。