定义:
许向一个先有的对象增添新的功能,同时又不改变其解构
业务场景:
相像一下,动物园里,我有一个方法,是打疫苗,管理员直接调用注射器的这个方法就能给所有动物打针。现在来了一个新动物:大熊猫。众所周知比较珍贵,所以打针之前要先做体检。有以下几个方案可以很容易想到:
1、直接修改注射器方法,增加判断,如果目标是大熊猫,就做体检(直接写)
2、如第1条,但是实现优雅一点,写个拦截器,aop,进行判断,如果是大熊猫,就体检。(aop)
3、购买新的注射器,这个注射器用来给所有需要注射前需要体检的动物使用(继承)
4、不单独购买,把这个注射器给指定部门A(装饰器类A),这个部门持有这个注射器,并强制执行:注射前体检(装饰器)
所以,上文第四个方法是最方便的,易于拓展。当更多的动物,有了更多的要求,我们只要增加更多的部门即可,这些部门都持有注射器。
拓展:后来,又来了一个动物,大象。太大了,体检进行不了,要先麻醉。怎么办?
5、成立新的部门B,这个部门持有上文中的部门A,并强制规定执行:注射前麻醉。
此时会有一个很常见又有趣的结构出现:
SyringeB b = new SyringeB(new SyringeA(new Syringe("流感疫苗")))
b.injection();
总结:我们装饰了注射器类,并增加了部分内容。对原类无任何侵入,所以原有调用都不用担心兼容问题。并且非常易于拓展。
以上。