一、
装饰设计模式——当想要对已有的对象进行功能增强时,可以定义类,将已有对象传进该类里,基于已有的功能并提供加强功能。那么自定义的该类称为装饰类。
对上面的定义的初步理解
class Person{public void chifan()
{
System.out.println("四十年代 吃饱饭就行");
}
}
class NewPerson{
private Person p ;
NewPerson(Person p){ // 装饰类通常会通过构造方法接收被装饰的对象。
this.p = p;
}
public void NewPersonchifan(){ // 并基于被装饰的对象的功能,提供更强的功能。
System.out.println("今天吃饭,先开胃酒");
p.chifan();
System.out.println("甜点");
System.out.println("躺沙发,看电影");
}
}
public class DecerateDesighModel {
public static void main(String[] args) {
Person p = new Person();
p.chifan();
}
}
现在人们在吃饭就是很享受了。
二、 装饰设计模式与继承的区别:
没有用代码的形式展现, 基本思想已经体现。
MyReader //需求: 专门用于读取数据的类
|--MyTextReader(子类)
|-- MyBufferTextReader //想提高点效率,就加入缓冲技术,继承MyTextReader这个类,然后对TextReader进行复写。
|--MyMediaReader
|-- MyBufferMediaReader
|--MyMailReader
|-- MyBufferMailReader
写到这就会发现虽然这个继承体系能用, 但是如果又新来一个数据类型的Reader,就必须又写一个对应的MyBufferXXXReader,导致这个体系扩展性极差,代码臃肿。
既然都缓冲功能,那么我就定义一个MyBufferReader,然后把被提高效率的对象传进来,谁进来谁进行增强。所以可以这么设计:
class MyBufferReader
{
MyBufferReader(MyTextReader text){}
MyBufferReader(MyMediaReader media){}
...那么如果再加一个子类,构造函数需要不断的修改,扩展性极差。
}
上面这个类扩展性很差,所以找到其参数的共同类型,通过多态的形式,可以提高扩展性。所以可以这样设计:
class MyBufferReader extends MyReader
{
private MyReader r;
MyBufferReader(MyReader r) //从继承结构变成了组合结构。
{}
}
MyReader //专门用于读取数据的类
|--MyTextReader
|--MyMidiaReader
|--MyDataReader
|--MyBufferReader
装饰模式比继承要灵活,避免了继承体系的臃肿,而且降低了类与类之间的层次关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能。
所以装饰类和被装饰类通常是都属于一个体系中。