使用维基百科( http://en.wikipedia.org/wiki/Decorator_pattern)上展示的咖啡装饰器示例,某人如何能够拥有只有装饰器才有的方法,例如,牛奶装饰器可以有一个名为"fatContent“的方法。对于这种设计模式,这是可能的吗?如果不是,我可以使用哪种模式来完成此任务?
发布于 2011-12-27 21:26:46
根据定义,装饰器模式不允许添加接口中定义的方法以外的方法。实际上,您总是可以向任何类添加方法,但是一旦这些方法没有在实现接口中定义,客户端就不能使用此接口调用它们。
您的问题的简单解决方案是定义几个接口,例如Coffee和Milk。然后,您可以定义实现这两个接口的类Capuchino,并且可能包含两个实例:SimpleCofee和FoamedMilk。但是这个解决方案看起来更像是Decorator和Facade的组合。
发布于 2011-12-27 21:25:26
你可以,但你需要知道类型以便实际调用该方法(假设没有反射等)。如果它与您传递的类型不匹配。
类型确定编译时已知的内容:如果CoffeeDecorater不包含fatContent签名,则接收到CoffeeDecoractor的任何内容都不会知道该方法的存在。
您可以创建一个额外的接口,但是您需要知道它是否存在以便您可以检查它(instanceof),或者询问类以检查特定的签名(反射)。
Java要么在编译时知道某个方法存在,要么在运行时检查它。
发布于 2011-12-27 21:24:27
装饰器可以有任意数量的特定方法。您可以引入装饰器特定的接口,该接口是装饰器除了实现装饰的接口之外还要实现的。
但是,必须有人知道这些方法的存在,因此要么装饰器必须在内部调用该方法,调用者必须知道它使用装饰器而不是装饰器对象(您可以使用instanceof进行测试),或者使用反射来检查这些方法。
https://stackoverflow.com/questions/8645089
复制相似问题