设计模式-装饰模式学习笔记
装饰模式
装饰模式:在不对原有类进行修改的情况下动态的对它进行扩展一些功能
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
- 优缺点
优点:
- 满足开闭原则
- 能够动态的增删功能,比继承更灵活
缺点:
- 会多出很多小类,增加了程序的复杂性
- 难以排错(多级装饰的对象,排错需要逐级排查)
- 特点
- 装饰对象和被装饰对象有共同的父类
- 装饰对象持有一个被装饰对象的实例(体现为拥有一个属性是父接口的对象)
- 装饰对象对调用方传过来的请求会转发给被装饰对象(体现为所有的子装饰类在操作时都会调用装饰类的方法,而装饰类会通过调用父接口对象的方法去调用被装饰对象的方法)
- 子装饰类在调用装饰对象的方法时会新增其他一些附加功能(装饰模式的意义)
- 结构
Component:装饰对象和被装饰对象的共同父类
ConcreteComponent:被装饰类,也为具体实现类
Decorator:装饰类,自装饰类的父类
ConcreteDecoratorA:子装饰类,提供特定的装饰
ConcreteDecoratorB:子装饰类,提供特定的装饰
更多的ConcreteDecorator(C,D,E,F)
- 代码
例子:武装机甲,一台机甲,没有任何装备,现在需要给机甲装上各种装备,机甲是被装饰对象,给机甲新增装备为装饰类,动态的添加武器装备和防具装备
被装饰对象与装饰对象的共同父类
/**
* @ Author :fonxi
* @ Date :2019/5/13 3:02
* @ Description:装饰对象和被装饰对象的共同父类
*/
public interface Component {
void operation();
}
被装饰对象,拥有完整的操作
/**
* @ Author :fonxi
* @ Date :2019/5/13 3:06
* @ Description:被装饰者对象 机甲类
*/
public class ConcreteComponent implements Component{
@Override
public void operation() {
System.out.println("末日机甲前来报道,装备:");
}
}
装饰类,持有一个被装饰对象的引用,并且在被调用时,调用被装饰对象的方法
/**
* @ Author :fonxi
* @ Date :2019/5/13 3:09
* @ Description:装饰类
*/
public abstract class Decorator implements Component {
//持有一个被装饰对象的引用
private Component component;
public void setComponent(Component component) {
this.component = component;
}
@Override
public void operation() {
if(component != null){
component.operation();
}
}
}
子装饰类,在调用提供特定的装饰操作时,调用父类方法
/**
* @ Author :fonxi
* @ Date :2019/5/13 3:18
* @ Description:具体装饰类 机甲装备武器改装类
*/
public class ConcreteDecoratorA extends Decorator{
@Override
public void operation() {
super.operation();
System.out.println("改装:等离子高频激光剑");
}
}
同上
/**
* @ Author :fonxi
* @ Date :2019/5/13 3:28
* @ Description:具体装饰类 机甲装备防具改装类
*/
public class ConcreteDecoratorB extends Decorator{
@Override
public void operation() {
super.operation();
System.out.println("改装:全适应立场防护盾");
}
}
输出结果:
末日机甲前来报到,装备: 改装:等离子高频激光剑 改装:全适应立场防护盾
- 总结
装饰模式能动态的扩展一个类,并且不修改原来的类,能够灵活的增删,比继承要好。(感觉作用和代理模式有点象^_^)
更多精彩

