装饰器模式,装饰包含不同方法的子类
Posted
技术标签:
【中文标题】装饰器模式,装饰包含不同方法的子类【英文标题】:Decorator Pattern, decorating subclasses that contain different methods 【发布时间】:2014-12-29 02:41:18 【问题描述】:假设我有一个Animal
抽象类和三个类Dog
、Cat
和Bear
,它们扩展了Animal
类。 Animal
类有抽象方法 getDescription
。 Dog
类有一个方法 getNumberOfHomeworksEaten
,但 Cat
和 Bear
没有。假设我有一个装饰器YellowStripes
、BlueStripes
、GreenStripes
,它们都扩展了Animal
类并装饰了getDescription
方法。如果我用装饰器装饰 Dog
、Cat
和 Bear
:
Animal dog = new Dog();
dog = YellowStripes(dog);
dog = BlueStripes(dog);
dog = GreenStripes(dog);
Cat cat = new Cat();
//decorate cat
Bear bear = new Bear();
//decorate bear
如何访问dog
的getNumberOfHomeworksEaten
方法?在每个装饰器中都有getNumberOfHomeworksEaten
是没有意义的,因为Cat
和Bear
没有那个方法。
【问题讨论】:
【参考方案1】:如果您将dog
转换为Dog
,您将能够使用此方法。
Animal animal = new Dog();
animal = YellowStripes(animal);
animal = BlueStripes(animal);
animal = GreenStripes(animal);
Dog dog = (Dog) animal;
dog.getNumberOfHomeworksEaten();
【讨论】:
旁注:在您的示例中,所有装饰器都必须扩展Dog
,否则您最终会得到ClassCastException
。
我不明白为什么这个答案被接受,因为正如@home 评论的那样,这种方法完全破坏了装饰器的全部意义。有了这个“解决方案”,应该为每个子类创建一个装饰器类。以上是关于装饰器模式,装饰包含不同方法的子类的主要内容,如果未能解决你的问题,请参考以下文章