内容由B站UP主动力节点产出,本文仅作为学习笔记
装饰设计模式
定义:在原有对象不做改变的基础上,将对象的功能附加上,扩展原有对象功能,比继承更加弹性。
举例说明:设计一个煎饼抽象类,一个煎饼装饰器类,煎饼装饰器类的实体类可以实现给煎饼加各种配菜,如鸡蛋、火腿。
public abstract class ABatterCake{
protected abstract String getInfo();
protected abstract int cost();
}
// 普通煎饼
public class BatterCake extends ABatterCake{
@Overried
protected abstract String getInfo(){
return "煎饼";
}
@Overried
protected abstract int cost(){
return 6;
}
}
// 煎饼装饰器
public abstract class ADecorator extends ABatterCake{
ABatterCake batterCake;
public ADecorator(ABatterCake batterCake){
this.batterCake = batterCake;
}
@Overried
protected abstract String getInfo(){
return batterCake.getInfo();
}
@Overried
protected abstract int cost(){
return batterCake.cost();
}
protected abstract void someThing();
}
下面来实现鸡蛋装饰器、火腿装饰器:
public class EggDecorator extends ADecorator{
public EggDecorator(ABatterCake batterCake){
super(batterCake);
}
@Overried
protected abstract String getInfo(){
return super.getInfo() + "加一个鸡蛋";
}
@Overried
protected abstract int cost(){
return super.cost() + 2;
}
@Overried
protected abstract void someThing(){
}
}
public class SausageDecorator extends ADecorator{
public SausageDecorator(ABatterCake batterCake){
super(batterCake);
}
@Overried
protected abstract String getInfo(){
return super.getInfo() + "加一个火腿";
}
@Overried
protected abstract int cost(){
return super.cost() + 3;
}
@Overried
protected abstract void someThing(){
}
}
装饰方式如下,使用测试类测试:
class Test{
public static void main(String[] args) {
// 点了一个基础煎饼
ABatterCake batterCake = new BatterCake();
// 加一个鸡蛋
batterCake = new EggDecorator(batterCake);
// 加一个火腿
batterCake = new SausageDecorator(batterCake);
System.out.println(batterCake.getInfo() + "价格:" + batterCake.cost());
}
}
总结
个人理解装饰器模式像相较于传统继承方式,在实体类和抽象类的继承关系中间添加了一个装饰器,该装饰器可以起到保护原有对象的作用。