装饰者模式优点
- 装饰者模式是继承的有力补充,且比继承灵活,可以砸不改变原有对象的情况下,动态地给一个对象扩展功能,即插即用
- 使用不同的装饰类及这些装饰类的排列组合,可以实现不同的效果
- 装饰者模式完全符合开闭原则
装饰者模式缺点
- 会出现更多的代码,更多的类,增加程序的复杂性
- 动态装饰时,多层装饰会更复杂
我们用装饰者模式来实现生活场景
创建一个煎饼类抽象类Battercake
/**
* @Author Lxq
* @Date 2020/3/25 16:01
* @Version 1.0
* 煎饼类
*/
public abstract class Battercake {
protected abstract String getMsg();
protected abstract int getPrice();
}
然后创建一个基本的煎饼类(基础套餐)BaseBattercake
/**
* @Author Lxq
* @Date 2020/3/25 16:26
* @Version 1.0
* 基础套餐(基本煎饼类)
*/
public class BaseBattercake extends Battercake {
@Override
protected String getMsg() {
return "煎饼";
}
@Override
protected int getPrice() {
return 5;
}
}
创建一个扩展套餐的抽象装饰类BattercakeDecorator
/**
* @Author Lxq
* @Date 2020/3/25 16:30
* @Version 1.0
* 抽象装饰类
*/
public abstract class BattercakeDecorator extends Battercake {
//静态代理,委派
Battercake battercake;
public BattercakeDecorator(Battercake battercake) {
this.battercake = battercake;
}
protected abstract void doSomething();
@Override
protected String getMsg() {
return this.battercake.getMsg();
}
@Override
protected int getPrice() {
return this.battercake.getPrice();
}
}
接下里就是鸡蛋的装饰类EggDecorator
/**
* @Author Lxq
* @Date 2020/3/25 16:35
* @Version 1.0
* 鸡蛋装饰类
*/
public class EggDecorator extends BattercakeDecorator{
public EggDecorator(Battercake battercake) {
super(battercake);
}
@Override
protected void doSomething() {
}
@Override
protected String getMsg() {
return super.getMsg() + "1个鸡蛋";
}
@Override
protected int getPrice() {
return super.getPrice() + 1;
}
}
最后创建香肠的装饰类
/**
* @Author Lxq
* @Date 2020/3/25 16:37
* @Version 1.0
* 香肠的装饰类
*/
public class SausageDecorator extends BattercakeDecorator{
public SausageDecorator(Battercake battercake) {
super(battercake);
}
@Override
protected void doSomething() {
}
@Override
protected String getMsg() {
return super.getMsg() + "1根香肠";
}
@Override
protected int getPrice() {
return super.getPrice() + 2;
}
}
编写客户端代码测试
public class Test {
public static void main(String[] args) {
Battercake battercake;
// 买一个煎饼不加东西
battercake = new BaseBattercake();
// 煎饼太小了,帮我加个鸡蛋
battercake = new EggDecorator(battercake);
// 妈耶一个鸡蛋这小,再来一个
battercake = new EggDecorator(battercake);
// 肚子太饿了,加一个香肠
battercake = new SausageDecorator(battercake);
System.out.println(battercake.getMsg() + ",总价" + battercake.getPrice());
}
}
煎饼1个鸡蛋1个鸡蛋1根香肠,总价9