概念
装饰模式是一种向已有的对象添加新功能的结构型模式,他创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
角色
抽象构建:他是具体构建和抽象装饰者的共同父类,用于定义业务方法。
具体构建:实现抽象构建的业务方法。
抽象装饰者类:实现抽象构建,并维护一个指向抽象构件对象的引用,通过该引用可以调用装饰之前构件对象的方法,并通过其子类扩展该方法,以达到装饰的目的。
具体装饰者:继承抽象装饰者,实现扩充方法。
Code
以前端构建界面时的各种View为例。
抽象构建
public interface View {
public void display();
}
具体构建
Button
public class Button implements View{
@Override
public void display() {
System.out.println("show button");
}
}
TextView
public class TextView implements View{
@Override
public void display() {
System.out.println("show TextView");
}
}
抽象装饰者
这里持有一个View子类的引用,用于扩充该View的内容。
public class AbsDecorator implements View{
private View view;
public AbsDecorator(View view) {
this.view = view;
}
@Override
public void display() {
view.display();
}
}
具体装饰者
实现了一个ImageButton
public class ImageDecorator extends AbsDecorator{
public ImageDecorator(View view) {
super(view);
}
@Override
public void display() {
super.display();
showImage();
}
private void showImage(){
System.out.println("show image");
}
}
客户端测试类
public class DecoratorClient {
public static void main(String[] args) {
View button = new Button();
View deco = new ImageDecorator(button);
deco.display();
}
}
The End
这样就实现了一个简单的装饰者模式了,这样我们想扩展一个类的时候不用非要继承他了。
优点: 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点: 多层装饰比较复杂。