为什么半透明装饰模式不能实现对同一个对象的多次装饰?
透明装饰器模式和半透明装饰器模式的区别是是否可以显示的调用具体装饰器类的业务方法,对于透明模式,每次都在重写的方法里增加了业务,每次在重写的方法中调用了parent.f(),都可以使用上次具体的增强方法,但对于半透明装饰器,不会在重写的方法中调用增强的方法(因为希望独立地调用),每一次装饰就丢失了上一次的装饰。
透明装饰不能多次装饰的原因我觉得是半透明装饰的本质问题,因为装饰者模式的精髓在于通过重写父类方法并在该方法上加上新增方法实现的。如果半透明装饰把它的新增方法给禁用了(让他们之间没有调用关系),那么相当于打断了它一条腿,对装饰对象不断装饰装饰再装饰,那么装饰子类是没有机会调用新增方法的。除了最外层的装饰子类可以手动调用装饰方法,再往里面的装饰子类就埋没了他们的“才能”。
由于半透明装饰模式的具体装饰类没有override从父类继承的方法,调用父类方法和调用新增方法是分开进行的,导致装饰效果没有累加起来,但不会让程序运行出错,所以不能实现对同一个对象的多次装饰。(被多次装饰得出的对象只能调用最后一个装饰类的新增方法,不能调用之前的装饰类的新增方法)