文章目录
- 什么是装饰器模式
- 例子:
- 总结
什么是装饰器模式
现在有一块蛋糕,涂上奶油就变成了奶油蛋糕,如果加上草莓就是草莓奶油蛋糕,再加上蜡烛就变成了生日蛋糕。
程序中的对象与蛋糕十分相似。将对象类比成蛋糕,不断的加功能对对象进行修饰,它就变成了更加明确的对象。像这样不断地为对象添加装饰的设计模式被称为(Decorator)装饰器模式
例子:
将原本只显示数字的类扩展成显示加减运算并展示结果的类
顶层接口:数字展示
NumberDisplay
package StructuralPattern.DecoratorMode;
/**
* 顶层数字显示接口
*/
public interface NumberDisplay {
void setTxt(int num);
String getTxt();
}
核心实现类:展示数字
NumberShow
package StructuralPattern.DecoratorMode;
/**
* 数字显示实现类
*/
public class NumberShow implements NumberDisplay{
private int num;
@Override
public void setTxt(int num) {
this.num = num;
}
@Override
public String getTxt() {
return String.valueOf(num);
}
}
扩展装饰器抽象类,专门用于扩展的抽象类
ArithmeticDecorator
package StructuralPattern.DecoratorMode;
/**
* 运算装饰器
*/
public abstract class ArithmeticDecorator implements NumberDisplay {
protected NumberDisplay target;
public ArithmeticDecorator(NumberDisplay target) {
this.target = target;
}
public void setTxt(int num) {
this.target.setTxt(num);
}
}
加号装饰器
PlusDecorate
package StructuralPattern.DecoratorMode;
/**
* 加号装饰器
*/
public class PlusDecorate extends ArithmeticDecorator {
private int num;
public PlusDecorate(NumberDisplay target,int num){
super(target);
this.num = num;
}
@Override
public String getTxt() {
return target.getTxt() + " + " + num;
}
}
减号装饰器
MinusDecorate
package StructuralPattern.DecoratorMode;
/**
* 减号装饰
*/
public class MinusDecorate extends ArithmeticDecorator {
private int num;
public MinusDecorate(NumberDisplay target,int num) {
super(target);
this.num = num;
}
@Override
public String getTxt() {
return target.getTxt() + " - " + num;
}
}
等号装饰器
EquelDecorate
package StructuralPattern.DecoratorMode;
/**
* 等号装饰
*/
public class EquelDecorate extends ArithmeticDecorator {
private int num;
public EquelDecorate(NumberDisplay target, int num) {
super(target);
this.num = num;
}
@Override
public String getTxt() {
return target.getTxt() + " = " + num;
}
}
Main
package StructuralPattern.DecoratorMode;
/**
* Main
*/
public class Main {
public static void main(String[] args) {
// 只展示核心功能
NumberDisplay display1 = new NumberShow();
display1.setTxt(1);
System.out.println(display1.getTxt());
// 展示扩展功能
NumberDisplay display2 = new PlusDecorate(display1,1);
NumberDisplay display3 = new MinusDecorate(display2,2);
NumberDisplay display4 = new EquelDecorate(display3,0);
System.out.println(display4.getTxt());
// 展示扩展功能
NumberDisplay display = new EquelDecorate(new MinusDecorate(new PlusDecorate(new NumberShow(),2),4),0);
display.setTxt(2);
System.out.println(display.getTxt());
}
}
结果
总结
从上边例子可以看出核心类NumberShow数字显示,并未发生改变,尽管被扩展了多次功能,但是核心接口api依旧可以使用。Decorator模式主要目的是通过添加装饰物来增加对象的功能,如果需要增加核心功能就在顶层接口增加方法,并增加顶层接口实现类的功能;对于附加接口,则通过抽象装饰器类去扩展。