设计模式(十二)之装饰器模式
文章目录
- 什么是装饰器模式
- 例子:
- 总结
什么是装饰器模式
现在有一块蛋糕,涂上奶油就变成了奶油蛋糕,如果加上草莓就是草莓奶油蛋糕,再加上蜡烛就变成了生日蛋糕。
程序中的对象与蛋糕十分相似。将对象类比成蛋糕,不断的加功能对对象进行修饰,它就变成了更加明确的对象。像这样不断地为对象添加装饰的设计模式被称为(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;@Overridepublic void setTxt(int num) {this.num = num;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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模式主要目的是通过添加装饰物来增加对象的功能,如果需要增加核心功能就在顶层接口增加方法,并增加顶层接口实现类的功能;对于附加接口,则通过抽象装饰器类去扩展。