当前位置: 首页 > 知识库问答 >
问题:

装饰器没有实现装饰接口

寿嘉悦
2023-03-14

我有一个小项目,用一个类包装另一个类的对象。修饰类实现了一个接口,但装饰类没有实现它。我很好奇它仍然是装饰模式还是其他模式,在我的项目中“装饰”类应该被称为包装器而不是装饰器。

我已经检查了iluwatar github存储库(https://github.com/iluwatar/java-design-patterns/tree/master/decorator/src/main/java/com/iluwatar/decorator)和tutorialspoint(https://www.tutorialspoint.com/design_pattern/decorator_pattern)。例如,在iluwatar中有:装饰器:

public class ClubbedTroll implements Troll

装饰:

public class SimpleTroll implements Troll

在这两种情况下(iluwatar和tutorialspoint),在装饰器和装饰类中都有共同的接口实现。这是否意味着必须将其称为装饰器设计模式?

共有2个答案

巢嘉志
2023-03-14

Decrator模式的本质是在不扩展对象的情况下为对象添加附加功能。关键词是additional,这意味着对象的公共API(或接口)仍然保持不变。没有这个概念,就没有使用Decorator的意义。

所以问题实际上是“一个对象在没有实现< code >接口的情况下是否仍然提供相同的公共API?”

恕我直言,这在其他语言中是可能的,但在 Java 中这是没有意义的,因为您无法保证对象具有相同的公共 API,因此依赖于它。

至于包装器-这是适配器模式的另一个名称。

越英范
2023-03-14

我想说,如果你没有在你的装饰器中实现这个接口,那么它就不能像原来的那样(装饰)。如果您正在实现接口,那么您可以在任何地方使用decorator,您可以使用原始接口If类。这就是为什么你必须使用这个界面。

如果你只是包装装饰,你就有一个包装器(委派模式)。

 类似资料:
  • Django为视图提供了数个装饰器,用以支持相关的HTTP服务。 允许的HTTP 方法 django.views.decorators.http 包里的装饰器可以基于请求的方法来限制对视图的访问。若条件不满足会返回 django.http.HttpResponseNotAllowed。 require_http_methods(request_method_list)[source] 限制视图只能

  • 装饰器(Decorators)(被babel支持, 在 03/17 之后作为stage-2的proposal被引入) 如果你在使用类似于mobx的库, 你能够使用装饰器装饰你的函数. 装饰器本质上其实就是将组件传入一个函数. 使用装饰器能让组件更灵活,更可读并且更易修改组件的功能. 不使用装饰器的例子 class ProfileContainer extends Component { //

  • 上一篇文章将通过解决一个需求问题来了解了闭包,本文也将一样,通过慢慢演变一个需求,一步一步来了解 Python 装饰器。 首先有这么一个输出员工打卡信息的函数: def punch(): print('昵称:两点水 部门:做鸭事业部 上班打卡成功') punch() 输出的结果如下: 昵称:两点水 部门:做鸭事业部 上班打卡成功 然后,产品反馈,不行啊,怎么上班打卡没有具体的日

  • fabfile 中可以方便使用的装饰器。 fabric.decorators.hosts(*host_list) 该装饰器用于指定被装饰的函数执行在那台主机或哪些主机列表上。 例如:如果不在控制台覆盖相关参数的话,将会在 host1、host2 以及 host3 上执行 my_func,并且在 host1 和 host3 上都指定了登录用户。 @hosts('user1@host1', 'host

  • 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。 >>> def now(): ... print '2013-12-25' ... >>> f = now >>> f() 2013-12-25 函数对象有一个__name__属性,可以拿到函数的名字: >>> now.__name__ 'now' >>> f.__name__ 'now' 现在,假设我

  • 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。 >>> def now(): ... print('2015-3-25') ... >>> f = now >>> f() 2015-3-25 函数对象有一个__name__属性,可以拿到函数的名字: >>> now.__name__ 'now' >>> f.__name__ 'now' 现在,假设我们