JAVA设计模式之装饰者模式
1. 定义
动态的给对象添加一些额外的职责,从而实现功能的扩展
提供了比继承更有弹性的替代方案(扩展原有功能)
2. 类型
结构型
3. 场景
- 在不影响对象的情况下,以透明的方式动态的给对象添加额外的职责
2… 动态的给一个对象添加功能,这些功能可以动态的撤销
4. 优点
继承的有利补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能
通过使用不同装饰类以及这些类的排列组合,可以实现不同的效果
符合开闭原则
5.缺点
会出现更多的代码,更多的类,增加程序复杂性
动态装饰时,多层装饰时会更复杂
6. 相关的设计模式
装饰者模式和代理模式
装饰者模式和适配器模式
7. 例证
- 你的女朋友外出,但是不知道穿什么衣服,这个时候,机智的你采用装饰者模式给你女朋友提供了n多种方案,jk装,汉服装等等,就这个样子你带着服装和你女朋友一起出去了,高兴的你即使累了也要完成啊
- 你的女朋友想吃煎饼果子,煎饼果子,外加的装饰有,辣酱,甜酱,香肠,脆饼,生菜等等,这个时候你也不知道选择啥,索性都加上去了。
8. coding
1. 抽象的煎饼
package com.maidou.learning.design.structure.decorator;
/**
* @Author maichen
* @Description : 抽象的煎饼
* @Date 23:20 2022/10/17
**/
public abstract class ABattercake {
protected abstract String getDesc();
protected abstract int price();
}
2. 具体的煎饼
package com.maidou.learning.design.structure.decorator;
public class Battercake extends ABattercake{
@Override
public String getDesc() {
return "煎饼";
}
@Override
public int price() {
return 8;
}
}
3.抽象的装饰者
public class AbstractDecorator extends ABattercake{
private ABattercake aBattercake;
public AbstractDecorator(ABattercake aBattercake) {
this.aBattercake = aBattercake;
}
@Override
protected String getDesc() {
return this.aBattercake.getDesc();
}
@Override
protected int price() {
return this.aBattercake.price();
}
}
4. 具体的装饰者
package com.maidou.learning.design.structure.decorator;
public class EggDecorator extends AbstractDecorator{
public EggDecorator(ABattercake aBattercake) {
super(aBattercake);
}
@Override
protected String getDesc() {
return super.getDesc() + "加一根鸡蛋";
}
@Override
protected int price() {
return super.price() + 2;
}
}
package com.maidou.learning.design.structure.decorator;
public class SausageDecorator extends AbstractDecorator{
public SausageDecorator(ABattercake aBattercake) {
super(aBattercake);
}
@Override
protected String getDesc() {
return super.getDesc() + "加一根香肠";
}
@Override
protected int price() {
return super.price() + 5;
}
}
9. 源码应用
- jdk Reader BufferReader
- spring