目录
前言
为什么需要装饰者模式
装饰者模式的实现
该设计模式与代理模式非常相似,代理模式控制的是对对象的访问,而装饰者模式则事先传入对象并动态的增加功能。通俗一点来说,就是在原有基础上辅以装饰。举个披萨的小例子,在披萨的诞生之初,其原本是作为底层人民裹腹使用,另一方面由于披萨的面积大,也被底层人民当做吃饭的工具使用,即在上面加上各种配料、小菜,此时也省去了饭后洗碗的操作。关于披萨,在我们这里就是一个主体,而上面的配料就是我们新增上去的,随着人民生活水平的提高,披萨上面的花样也五花八门,这便是在原披萨上动态的增加装扮。
它设计之初的目标就是为了动态的增加某个类的功能,以往我们想要扩展某个类的功能时往往采用子类的方式实现,若扩展的功能很多那么此时则会产生很多子类,而装饰者模式相比继承的方式会更加灵活一点,一般可在不想产生过多子类的情况下使用装饰者模式。
实现其实很简单,与代理模式类似,装饰者与被装饰者需要实现共同的接口
1、定义一个食物接口
public interface Food { void say(); }2、新建披萨类并实现食物接口
public class Pizza implements Food { @Override public void say() { System.out.println("i'm a pizza"); } }3、创建披萨的装饰类,实现同一个食物接口
public class PizzaDecorator implements Food { private Food food; // 装饰者模式需要传入对应的对象 public PizzaDecorator(Food food) { this.food = food; } @Override public void say() { // 新增的业务代码 System.out.println("加点牛肉"); food.say(); } }4、测试
public class DecoratorTest { @Test public void test() { PizzaDecorator pizzaDecorator = new PizzaDecorator(new Pizza()); pizzaDecorator.say(); } } 加点牛肉 i'm a pizza Process finished with exit code 0装饰者模式可以看成是继承的一个替代模式,其装饰类与被装饰类可以相互发展不会产生耦合关系。