问题标签 [decorator-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
841 浏览

c# - 依赖注入机制提供通用服务接口的最具体实现

我觉得我用标题玩了流行语宾果游戏。这是我要问的一个简明示例。假设我对某些实体有一些继承层次结构。

现在假设我有一个服务的通用接口,它的方法使用基类:

我有一些具体的实现:

假设我已经在容器中注册了这些。所以现在我的问题是,如果我正在迭代如何获得最接近匹配的注册服务ListBaseEntity

我想要做的是建立一个机制,如果一个实体有一种ClassA方法类型,它将找不到特定类的服务,因此会返回BaseEntityService。稍后,如果有人出现并为此服务添加了注册:

假设的GetService方法将开始为ClassAEntityService类型提供 ,ClassA而无需任何进一步的代码更改。相反,如果有人出现并删除了所有服务,但BaseEntityServiceGetService方法将返回所有继承自BaseEntity.

我很确定即使我使用的 DI 容器不直接支持它,我也可以滚动一些东西。我在这里落入陷阱了吗?这是反模式吗?

编辑:

与@Funk 的一些讨论(见下文)和一些额外的谷歌搜索,这些讨论让我想到要查找,这让我添加了更多的流行语。似乎我正在尝试以类型安全的方式收集 DI 容器、策略模式和装饰器模式的所有优点,而不使用服务定位器模式。我开始怀疑答案是否是“使用函数式语言”。

0 投票
2 回答
1341 浏览

java - 用新特性丰富类的设计模式

我已经实现了一系列类来使用JSFPrimeFaces管理搜索/详细信息页面。更详细地说,我创建了一个抽象类SearchDetailView<C extends BaseView, M>以集中搜索/详细信息页面的常用功能。

简而言之,我有一个MyView扩展 base的类SearchDetailView。现在我想添加另一个行为MyView,即Confirm Dialog

我想知道我必须使用什么设计模式?我打算使用设计模式Decorator,但我不需要在运行时添加新行为,但我已经知道行为MyView需要什么。

我不能扩展两个类(显然),但我不喜欢有很多“基”类的组合。我想创建第二个抽象类ConfirmDialogDecorator,以便“以编程方式”添加额外的功能。

那么,我问你哪种设计模式为类添加了行为?

实际上我的代码如下:

但我想ConfirmDialogDecoratorSearchDetailView. 任何想法?谢谢。

更新: 正如两个答案中所建议的,我使用了 Java 8 默认方法(Mixin 模式?):

在 xhtml 中:

0 投票
2 回答
119 浏览

java - 获取装饰器对象的所有类型:包装对象的类型和包装对象的类型

所以,这是我的设计。AccessDecorator类有对另一个的引用,Access就像普通的装饰器模式一样。

设计

但问题是当我创建一个AccessDecorator包装 aConcreteAccess然后尝试查看 Access 是哪种类型时:

当然这行不通,因为wrapperAccess不是类型InAllowedAccess ,但我真正想知道的是 some 的所有类型Access在这种情况下, thewrapperAccess不仅是类型MismatchAccess,而且是类型InAllowedAccess

我考虑过在类中实现 , 和 , 之类的方法,isInstanceofInAllowed()但似乎不是isInstanceofOutAllowed()一个好的解决方案,我不知道......isInstanceofInDenied()isinstanceofOutDenied()isinstanceofMismatch()Access

否则我应该MismatchAccesses为每 4 种类型创建一个大的分层树InAllowedMismatchAccessOutAllowedMismatchAccess和?然后,当我开发另一个装饰器时?...InDeniedMismatchAccessOutDeniedMismatchAccess

还是有其他更好的设计?

我怎样才能知道 a 的所有类型Access?不仅是包装访问的类型,还有包装访问的类型。

编辑: 我的一个需求是:Access按类型过滤 es 集合 -ÌnAllowedAccess,InDeniedAccess,OutAllowedAccess,OutDeniedAccess,MismatchAccess(这是一个装饰器)和我可能开发的其他类型的装饰器

0 投票
1 回答
37 浏览

python - 抽象装饰器,重传到子类时出错

我尝试实现装饰器模式。Hero是不能改变的主类,然后我有AbstractEffects,它是Hero的子类和AbstractNegative和AbstractPositive的父类。另一方面,AbstractNegative 和 AbstractPositive 是 Curse、Berserk 等的父类。

当我尝试这样做时

我有这个错误:“AttributeError:'Berserk'对象没有属性'stats'”我无法理解如何解决这个错误。

0 投票
2 回答
182 浏览

java - java - 如何在Java运行时更改具体装饰器中的变量

这是情况。

带有 JLabel 的 Items 抽象类label,以及display()通过将 JLabel 添加到 JPanel 来在屏幕上显示项目的功能:

具体实现:

装饰师:

和混凝土装饰器:

和客户端类:

因此,当我创建一个Items由 a 装饰的对象时ConcreteDecorator,该display()函数应将所有标签添加到面板。我想在运行时将 ConcreteDecorator 中标签的可见性设置为false,即label.setVisible(false),以便将其从屏幕上删除。我怎样才能从只有item对象的 Client 类中做到这一点?

0 投票
0 回答
27 浏览

java - 在输入的情况下创建不同的装饰对象

假设我使用装饰设计模式来制作披萨。用户可以添加 3 种成分的比萨。马苏里拉奶酪、酱汁和蔬菜。我准备了这些课程并设定了成本。
这是主要代码


这是界面


这是基础披萨


这是装饰器类


成分类之一是


其他人看起来像他们。
现在,我想从用户那里获取他们想要的输入。为了输入,我将创建比萨饼。他们可能只想要普通的披萨。但是从那以后,我创建了我的披萨 -> Pizza p = new TomatoSauce(new Mozarella(new PlainPizza())); 像这样。如何制作动态披萨?我是否必须使用 if-else 或 switch-case 检查每个条件?

0 投票
1 回答
85 浏览

c# - 如何在以下场景中使用 Autofac 实现装饰器模式

我需要使用 Autofac 实现装饰器模式。

我有两个具有自己实现的类/服务。现在基于一个条件,我需要能够动态调用任一服务类来获取数据。

目前我已经注册了 ServiceClassA 和 ServiceClassB,如下所示

从控制器 (ControllerClass) 中调用 ServiceClassA,如下所示

进行上述调用时,应根据条件(日期 > 31st March 2020 )调用 ServiceClassB 中的方法 B。为了实现这一点,我们的技术架构师认为 Autofac 的装饰器模式是对现有代码流影响不大的解决方案。

所以我对 ServiceClassA 注册进行了以下更改

完成上述步骤后,我被卡住了,不知道如何应用条件。在stackoverflow上检查了很多答案,以找到无法解决的解决方案。

0 投票
1 回答
49 浏览

design-patterns - 如何使用装饰器模式构建东西对象?

我对装饰器模式有一些疑问。据我了解,装饰器模式的存在是为了向对象添加行为,即“装饰对象”,因此您可以组合不同的对象,而无需实现大量不同的类,只需进行微小的更改,从而导致“类爆炸” ”。

现在的问题是,一般化的装饰器模式说我们应该有一个基类,然后我们的装饰器类扩展它,但也可以从中进行委托。所以装饰器本质上“是一个”和“有一个”基类(以及它的方法)。

问题就来了,因为让我们说我想为一个游戏组成一个“玩家”,实际上有很多不同的玩家,而且都有微小的变化。然后我可能想使用装饰器模式(?)并说“好吧,我们的基类是普通人”。我想用枪和防弹衣装饰这个人。然后我的装饰器类 gun 将实现与人类相同的方法,让我们说“吃”。但是我的枪肯定不会吃,我只希望它能够射击。我可以通过返回 null 或其他东西来解决这个问题,但这也会破坏接口隔离原则。

那么我如何在不破坏 ISP 的情况下解决这个问题,同时又不需要创建大量更改最小的类,例如“带枪的人”、“带枪和防弹衣的人”、“带工作人员和防弹衣的人”, “人与员工”,你明白了。

0 投票
0 回答
86 浏览

django - 在 Django 中间件中实现了哪种模式?(责任链或装饰者)

我试图弄清楚 Django Middleware 中使用了什么模式。也许有模式的组合?

0 投票
2 回答
45 浏览

inheritance - 装饰器模式的继承

在装饰器模式中,一个抽象类实现一个接口,一个具体类(装饰器)扩展抽象类。如果具体类直接实现接口而不是通过抽象类继承接口,模式的功能会发生什么?