> 文章列表 > 设计模式(十二)之装饰器模式

设计模式(十二)之装饰器模式

设计模式(十二)之装饰器模式

文章目录

  • 什么是装饰器模式
  • 例子:
  • 总结

什么是装饰器模式

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