女生先有一个基础的展示行为,抽象出来定义为接口Showable
public interface Showable {
public void show(); //标准展示行为
}
定义女生类并描述行为
public class Girl implements Showable {
@Override
public void show() {
System.out.println("女生的素颜");
}
}
当前只是素颜,要开始化妆了
定义装饰器抽象类
public abstract class Decorator implements Showable {
protected Showable showable;
public Decorator(Showable showable){
this.showable=showable;
}
@Override
public void show() {
//直接调用不加任何装饰
showable.show();
}
}
定义粉底类继承装饰器类
public class FoundationMakeup extends Decorator {
public FoundationMakeup(Showable showable){
super(showable); //调用抽象父类的构造注入
}
@Override
public void show() {
System.out.print("打粉底【");
super.show();
System.out.print("】");
}
}
定义口红类继承装饰器类
public class Lipstick extends Decorator {
public Lipstick(Showable showable){
super(showable);
}
@Override
public void show() {
System.out.print("涂口红【");
super.show();
System.out.print("】");
}
}
粉底类和口红类都有自己特有的打粉底和涂口红的操作
测试类
public class Client {
public static void main(String[] args) {
//口红包裹粉底,粉底再包裹女生
Showable madeupGirl = new Lipstick(new FoundationMakeup(new Girl()));
madeupGirl.show();
}
}
测试类中出现了多层构造方法,调用已经装饰好的madeupGirl对象的show方法,所有装饰效果一触即发。
装饰器模式类结构:
组件接口:被装饰组件对应的接口标准,指定进行装饰的行为方法,如本例接口Showable。
组件实现:需要被装饰的组件,实现组件接口标准,只具备自身未被装饰的原始特性,如本例中女生类Girl。
装饰器:装饰器的高层抽象类,同样实现组件接口标准,且包含一个被装饰的组件。
装饰器实现:继承自装饰器抽象类的具体子类装饰器,可以有多种实现,并在被装饰组件对象的基础上为其添加新的特性。如本例中的粉底类和口红类。