设计模式-装饰者模式
裝饰器模式装饰器模式( Decorator Pattern)也称为包装模式( Wrapper Pattern)是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比継承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式
装饰器模式的核心是功能扩展。使用装饰器模式可以透明且动态地扩展类的功能。
package com.lx.designPattern.decorator.battercake;
/**
* @program: People
* @description: 装饰者模式
* @author: liu wei ping
* @create: 2022-05-02 13:23
*/
public abstract class Battercake {
/**
* 煎饼果子信息
* @return
*/
protected abstract String getMsg();
/**
* 煎饼果子价格
* @return
*/
protected abstract int getPrice();
}
package com.lx.designPattern.decorator.battercake;
/**
* @program: People
* @description: 装饰者模式
* @author: liu wei ping
* @create: 2022-05-02 13:23
*/
public class BaseBattercake extends Battercake{
/**
* 煎饼果子信息
* @return
*/
protected String getMsg(){return "煎饼";};
/**
* 煎饼果子价格
* @return
*/
public int getPrice(){return 5;};
}
package com.lx.designPattern.decorator.battercake;
/**
* @program: People
* @description: 装饰者模式
* @author: liu wei ping
* @create: 2022-05-02 13:23
*/
public class BattercakeDecorator extends BaseBattercake{
private Battercake battercake;
public BattercakeDecorator(Battercake battercake){
this.battercake=battercake;
}
/**
* 煎饼果子信息
* @return
*/
protected String getMsg(){return this.battercake.getMsg();};
/**
* 煎饼果子价格
* @return
*/
public int getPrice(){return this.battercake.getPrice();};
}
package com.lx.designPattern.decorator.battercake;
/**
* @program: People
* @description: 装饰者模式
* @author: liu wei ping
* @create: 2022-05-02 13:23
*/
public class EggDecorator extends BattercakeDecorator{
private Battercake battercake;
public EggDecorator(Battercake battercake){
super(battercake);
}
/**
* 煎饼果子信息
* @return
*/
protected String getMsg(){return super.getMsg() + "1个鸡蛋";};
/**
* 煎饼果子价格
* @return
*/
public int getPrice(){return super.getPrice() + 1;};
}
package com.lx.designPattern.decorator.battercake;
/**
* @program: People
* @description: 装饰者模式
* @author: liu wei ping
* @create: 2022-05-02 13:23
*/
public class SauageDecorator extends BattercakeDecorator{
private Battercake battercake;
public SauageDecorator(Battercake battercake){
super(battercake);
}
/**
* 煎饼果子信息
* @return
*/
protected String getMsg(){return super.getMsg() + "1根香肠";};
/**
* 煎饼果子价格
* @return
*/
public int getPrice(){return super.getPrice() + 2;};
}
package com.lx.designPattern.decorator.battercake;
/**
* @program: People
* @description: 装饰者模式测试
* @author: liu wei ping
* @create: 2022-05-02 13:37
*/
public class Test {
public static void main(String[] args) {
Battercake battercake;
battercake = new BaseBattercake();
battercake = new EggDecorator(battercake);
battercake = new EggDecorator(battercake);
battercake = new SauageDecorator(battercake);
System.out.println(battercake.getMsg() + ",总价" + battercake.getPrice());
}
}
测试结果如下图:
装饰器模式的优缺点:
优点:1、装饰器是继承的有力补充,比继承灵活,不改变原有对象的情况下动态地给一个对象扩展功能,即插即用。2、通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果3、装饰器完全遵守开闭原则。
缺点:1、会出现更多的代码,更多的类,增加程序复杂性。2、动态装饰时,多层装饰时会更复杂。