1.为什么要使用装饰者模式
月饼是久负盛名的中国传统糕点之一,直至今天月饼的种类已经有各种各样的,比如:五仁月饼,它是将杏仁、桃仁、橄榄仁、芝麻仁和瓜子仁添加到月饼中,让月饼味道更丰富。装饰者模式也是一样,都是扩展的原有的功能,这个可以实现继承的效果并且扩展性更强,所以它可以作为继承的一种替代物。
2.实例
被装饰者的接口
public interface MoonCake {
void display();
}
被装饰者的实现类
public class OrdinaryMoonCake implements MoonCake {
@Override
public void display() {
System.out.println("这是一个普通的月饼");
}
}
装饰者抽象类:
public abstract class MoonCakeWrapper implements MoonCake {
private MoonCake moonCake; // 被装饰者的引用
public MoonCakeWrapper(MoonCake moonCake) {
this.moonCake = moonCake;
}
@Override
public void display() {
moonCake.display();
}
}
具体装饰者1
public class PeachSeedMoonCakeWrapper extends MoonCakeWrapper {
public PeachSeedMoonCakeWrapper(MoonCake moonCake) {
super(moonCake);
}
@Override
public void display() {
super.display();
System.out.println("添加桃仁");
}
}
具体装饰者2
public class SesameSeedMoonCakeWrapper extends MoonCakeWrapper {
public SesameSeedMoonCakeWrapper(MoonCake moonCake) {
super(moonCake);
}
@Override
public void display() {
super.display();
System.out.println("添加瓜子仁");
}
}
具体装饰者3
public class AlmondMoonCakeWrapper extends MoonCakeWrapper {
public AlmondMoonCakeWrapper(MoonCake moonCake) {
super(moonCake);
}
@Override
public void display() {
super.display();
System.out.println("添加杏仁");
}
}
测试代码:
public class TestWrapper {
public static void main(String[] args) {
OrdinaryMoonCake ordinaryMoonCake = new OrdinaryMoonCake();
MoonCake moonCake = new SesameSeedMoonCakeWrapper(new PeachSeedMoonCakeWrapper(new AlmondMoonCakeWrapper(ordinaryMoonCake)));
moonCake.display();
}
}
----------------------------console
这是一个普通的月饼
添加杏仁
添加桃仁
添加瓜子仁