一、装饰器模式
概念:又名包装(Wrapper)模式,动态地给对象添加额外的职责,从增强功能的角度来说,Decorator模式比子类继承更加灵活,Decorator模式以对客户端透明的方式扩展对象功能
应用场景:
- 以动态、透明的方式增强对象功能
- 增强的功能可以被撤销
- 无法采用子类继承增强的情况
装饰器结构:
- Componet:定义一个抽象类
//可以是接口,可以是抽象类
public interface Component {
public void func();
}
- ConcreteComponent:定义一个对象,继承自Component,实现Component中方法
public class ConcreteComponent implements Component {
@Override
public void func() {
//TODO 实际业务1
}
//此对象独有的方法,与装饰器无关,因为Component接口没有定义func1()
//Decorator传入的new ConcreteComponent对象,向上转型Component时只有父类Component的方法和属性
//在装饰器里没必要定义这种方法,这里只是说明向上转型的问题
public void func1(){
//TODO 实际业务2,此业务无法被装饰
}
}
- Decorator:定义一个装饰器抽象类,维持一个指向Component实例引用,并且定义个与Component接口一致的接口
public class Decorator implements Component {
//定义指向Component的实例引用
private Component component;
//构造函数初始化component
public Decorator(Component component) {
this.component = component;
}
//Decorator继承ConcreteComponent实际业务1,可添加的基类的装饰业务
@Override
public void func() {
//继承实际业务1
component.func();
//实际业务1内部扩展基类的装饰业务
func2(){//do sth}
}
//不在实际业务1内扩展,单独扩展基类的其他装饰业务,
public void functest(){//do sth}
}
- ConcreteDecorator:具体的装饰对象,给对象增强功能
public class ConcreteDecoratorA extends Decorator {
//构造函数初始化ConcreteComponent
public ConcreteDecoratorA(Component component) {
//采用Decorator构造函数初始化
super(component);
}
//继承装饰器基类Decorator的实际业务1+基类的装饰业务,再添加其他具体的装饰业务
@Override
public void func() {
//继承的实际业务1+基类的装饰业务
super.func();
//具体ConcreteComponentA添加的其他装饰业务等
func3(){//do sth}
}
//具体的其他的装饰业务
public void func4(){//do sth}
}
注:关于向上转型,向下转型的概念可自行百度,示例
Component c= new ConcreteComponent(); //向上转型
c.func1();//编译报错
ConcreteComponent中的 func1() 方法是独属于ConcreteComponent对象的方法,在Java中父类引用指向子类对象是自动成功的,但是父类引用指向子类对象,只能调用来自父类的属性/行为,所以上面第二行代码编译报错。
装饰器示例代码——穿衣服
package Decorator;
//Component抽象类或者接口——美女
interface BeautifulGirl {
public void dressup();
}
//wpp是美女的实例
class Wpp implements BeautifulGirl {
@Overri