装饰着模式:简单的一句话理解就是,动态的给一个对象添加一些额外的功能,装饰者模式相对于生成子类更加的灵活。ide
咱们来看下装饰者模式的UML图:测试
Component(抽象构件):它是装饰类和具体构件的公共父类;this
ConcreteComponent(具体构件):具它是抽象构件对象的子类,用来定义具体的构件对象;spa
Decorator(抽象装饰类):进继承抽象构件,用于给具体的构件添加一些新的职责;code
ConcreteDecoraror(具体装饰类):实现了抽象装饰类,它负责向构件添加新的职责;对象
业务场景:现咱们如今模拟这样一个场景,咱们点了一杯奶茶,而后给奶茶中加了冰块,加了珍珠,最后咱们还想再给加点红豆,这里加红豆就使用了装饰者。blog
咱们下来建立一个奶茶的抽象类,想到于Component继承
public interface MilkyTea { public void recipe(); }
咱们再来建立要给奶茶的具体子类,至关于ConcreteComponentip
public class MilkyTeaA implements MilkyTea { @Override public void recipe() { System.out.println("老板来一杯奶茶,加冰块"); } }
接下来建立一个装饰类,至关于Decoratorci
public class Decorator implements MilkyTea { private MilkyTea milkyTea; public void setMilkyTea(MilkyTea milkyTea) { this.milkyTea = milkyTea; } @Override public void recipe() { milkyTea.recipe(); } }
建立装饰类的子类,添加珍珠,至关于ConcreteDecorator
public class MilkyTeaADecorator extends Decorator { @Override public void recipe() { super.recipe(); recipeZZ(); } // 加珍珠 public void recipeZZ() { System.out.println("老板再加点珍珠吧"); } }
建立装饰者的子类,添加红豆,至关于ConcreteDecorator
public class MilkyTeaBDecorator extends Decorator { @Override public void recipe() { super.recipe(); recipeHD(); } public void recipeHD() { System.out.println("老板你再给加点红豆吧"); } }
最后咱们测试一下看下结果:
public class Test { public static void main(String[] args) { MilkyTeaA milkyTea = new MilkyTeaA(); MilkyTeaADecorator milkyTeaA = new MilkyTeaADecorator(); MilkyTeaBDecorator milkyTeaB = new MilkyTeaBDecorator(); milkyTeaA.setMilkyTea(milkyTea); milkyTeaB.setMilkyTea(milkyTeaA); milkyTeaB.recipe(); } }
经过这个小例子咱们能够发现,装饰者模式是为了已有的功能动态的添加更多功能的一种方式。
装饰模式的优势:把类中的装饰功能从类中搬移去除,这样能够简化原有的类;