代码拉取完成,页面将自动刷新
装饰者模式(Decorator Pattern)是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式。
用于扩展一个类的功能或给一个类添加附加职责。
动态的给一个对象添加功能,这些功能可以再动态的撤销。
比如我们在买煎饼果子时,有时会加一个蛋或者香肠之类的,这时我们的装饰者模式就派上用场了
煎饼抽象类
public abstract class Battercake {
public abstract String getMsg();
public abstract int getPrice();
}
煎饼基础实现 - 定义了基础的煎饼
public class BaseBattercake extends Battercake {
@Override
public String getMsg(){
return "煎饼";
}
@Override
public int getPrice(){ return 5; }
}
煎饼装饰者抽象类 - 我们在其中将煎饼作为成员变量进行保存
public abstract class BattercakeDecorator extends Battercake {
//静态代理, 委派
private Battercake battercake;
public BattercakeDecorator(Battercake battercake) {
this.battercake = battercake;
}
protected abstract void doSomething();
@Override
public String getMsg() {
return this.battercake.getMsg();
}
@Override
public int getPrice() {
return this.battercake.getPrice();
}
}
鸡蛋装饰者 - 它获取父类返回值,并进行累加
public class EggDecorator extends BattercakeDecorator {
public EggDecorator(Battercake battercake) {
super(battercake);
}
@Override
protected void doSomething() {}
@Override
public String getMsg() {
return super.getMsg() + "+1 个鸡蛋";
}
@Override
public int getPrice() {
return super.getPrice() + 1;
}
}
香肠装饰者
public class SausageDecorator extends BattercakeDecorator {
public SausageDecorator(Battercake battercake) {
super(battercake);
}
@Override
protected void doSomething() {
}
@Override
public String getMsg() {
return super.getMsg() + "+1 根香肠";
}
@Override
public int getPrice() {
return super.getPrice() + 2;
}
}
测试 - 在该代码中,我们通过类的累加实现了对基类的修改
public static void main(String[] args) {
Battercake battercake;
//路边摊买一个煎饼
battercake = new BaseBattercake();
//煎饼有点小, 想再加一个鸡蛋
battercake = new EggDecorator(battercake);
//再加一个鸡蛋
battercake = new EggDecorator(battercake);
//很饿, 再加根香肠
battercake = new SausageDecorator(battercake);
//跟静态代理最大区别就是职责不同
//静态代理不一定要满足 is-a 的关系
//静态代理会做功能增强, 同一个职责变得不一样
//装饰器更多考虑是扩展
System.out.println(battercake.getMsg() + ",总价: " + battercake.getPrice());
}
输出
煎饼+1 个鸡蛋+1 个鸡蛋+1 根香肠,总价: 9
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。