装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,
并提供加强功能,那么自定义的该类就称为装饰类。
装饰类通常通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的
功能。
//例子1:
class Person { public void chifan() { System.out.println("吃饭"); } } class SuperPerson { private Person p; public SuperPerson(Person p) { this.p = p; } public void chifan() { System.out.println("开胃酒"); p.chifan(); System.out.println("甜点"); System.out.println("抽一根"); } } class PersonDemo { public static void main(String[] args) { Person p = new Person(); // p.chifan(); SuperPerson sp = new SuperPerson(p); sp.chifan(); } }
装饰与继承的区别:
功能增强之前:
MyReader //专门用于读取数据的类。
|--MyTextReader
|--MyBufferedTextReader
|--MyMediaReader
|--MyBufferedMediReader
|--MyDataReader
|--MyBufferedDataReader
功能增强:
class MyBufferedReader
{
MyBufferedReader(MyTextReader text){ }MyBufferedReader(MyMediaReader media){ }MyBufferedReader(MyDataReader data){ }
}
//上面的这个类扩展性很差。
找到其参数的共同类型。通过多态的形式,可以提高扩展性。
class MyBufferedReader extends MyReader
{
private MyReader r;MyBufferedReader(MyReader r){ }
}
功能增强之后:
MyReader //专门用于读取数据的类。
|--MyTextReader
|--MyMediaReader
|--MyDataReader
|--MyBufferReader
装饰模式要比继承更灵活,避免了继承体系的臃肿。而且降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能。所以装饰类和被装饰类通常都是在同一个体系中的。