问题标签 [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.
c# - 依赖注入机制提供通用服务接口的最具体实现
我觉得我用标题玩了流行语宾果游戏。这是我要问的一个简明示例。假设我对某些实体有一些继承层次结构。
现在假设我有一个服务的通用接口,它的方法使用基类:
我有一些具体的实现:
假设我已经在容器中注册了这些。所以现在我的问题是,如果我正在迭代如何获得最接近匹配的注册服务List
?BaseEntity
我想要做的是建立一个机制,如果一个实体有一种ClassA
方法类型,它将找不到特定类的服务,因此会返回BaseEntityService
。稍后,如果有人出现并为此服务添加了注册:
假设的GetService
方法将开始为ClassAEntityService
类型提供 ,ClassA
而无需任何进一步的代码更改。相反,如果有人出现并删除了所有服务,但BaseEntityService
该GetService
方法将返回所有继承自BaseEntity
.
我很确定即使我使用的 DI 容器不直接支持它,我也可以滚动一些东西。我在这里落入陷阱了吗?这是反模式吗?
编辑:
与@Funk 的一些讨论(见下文)和一些额外的谷歌搜索,这些讨论让我想到要查找,这让我添加了更多的流行语。似乎我正在尝试以类型安全的方式收集 DI 容器、策略模式和装饰器模式的所有优点,而不使用服务定位器模式。我开始怀疑答案是否是“使用函数式语言”。
java - 用新特性丰富类的设计模式
我已经实现了一系列类来使用JSF和PrimeFaces管理搜索/详细信息页面。更详细地说,我创建了一个抽象类SearchDetailView<C extends BaseView, M>
以集中搜索/详细信息页面的常用功能。
简而言之,我有一个MyView
扩展 base的类SearchDetailView
。现在我想添加另一个行为MyView
,即Confirm Dialog。
我想知道我必须使用什么设计模式?我打算使用设计模式Decorator,但我不需要在运行时添加新行为,但我已经知道行为MyView
需要什么。
我不能扩展两个类(显然),但我不喜欢有很多“基”类的组合。我想创建第二个抽象类ConfirmDialogDecorator
,以便“以编程方式”添加额外的功能。
那么,我问你哪种设计模式为类添加了行为?
实际上我的代码如下:
但我想ConfirmDialogDecorator
从SearchDetailView
. 任何想法?谢谢。
更新: 正如两个答案中所建议的,我使用了 Java 8 默认方法(Mixin 模式?):
在 xhtml 中:
java - 获取装饰器对象的所有类型:包装对象的类型和包装对象的类型
所以,这是我的设计。AccessDecorator
类有对另一个的引用,Access
就像普通的装饰器模式一样。
但问题是当我创建一个AccessDecorator
包装 aConcreteAccess
然后尝试查看 Access 是哪种类型时:
当然这行不通,因为wrapperAccess
不是类型InAllowedAccess
,但我真正想知道的是 some 的所有类型Access
。在这种情况下, thewrapperAccess
不仅是类型MismatchAccess
,而且是类型InAllowedAccess
我考虑过在类中实现 , 和 , 之类的方法,isInstanceofInAllowed()
但似乎不是isInstanceofOutAllowed()
一个好的解决方案,我不知道......isInstanceofInDenied()
isinstanceofOutDenied()
isinstanceofMismatch()
Access
否则我应该MismatchAccesses
为每 4 种类型创建一个大的分层树InAllowedMismatchAccess
,OutAllowedMismatchAccess
和?然后,当我开发另一个装饰器时?...InDeniedMismatchAccess
OutDeniedMismatchAccess
还是有其他更好的设计?
我怎样才能知道 a 的所有类型Access
?不仅是包装访问的类型,还有包装访问的类型。
编辑:
我的一个需求是:Access
按类型过滤 es 集合 -ÌnAllowedAccess
,InDeniedAccess
,OutAllowedAccess
,OutDeniedAccess
,MismatchAccess
(这是一个装饰器)和我可能开发的其他类型的装饰器
python - 抽象装饰器,重传到子类时出错
我尝试实现装饰器模式。Hero是不能改变的主类,然后我有AbstractEffects,它是Hero的子类和AbstractNegative和AbstractPositive的父类。另一方面,AbstractNegative 和 AbstractPositive 是 Curse、Berserk 等的父类。
当我尝试这样做时
我有这个错误:“AttributeError:'Berserk'对象没有属性'stats'”我无法理解如何解决这个错误。
java - java - 如何在Java运行时更改具体装饰器中的变量
这是情况。
带有 JLabel 的 Items 抽象类label
,以及display()
通过将 JLabel 添加到 JPanel 来在屏幕上显示项目的功能:
具体实现:
装饰师:
和混凝土装饰器:
和客户端类:
因此,当我创建一个Items
由 a 装饰的对象时ConcreteDecorator
,该display()
函数应将所有标签添加到面板。我想在运行时将 ConcreteDecorator 中标签的可见性设置为false
,即label.setVisible(false)
,以便将其从屏幕上删除。我怎样才能从只有item
对象的 Client 类中做到这一点?
java - 在输入的情况下创建不同的装饰对象
假设我使用装饰设计模式来制作披萨。用户可以添加 3 种成分的比萨。马苏里拉奶酪、酱汁和蔬菜。我准备了这些课程并设定了成本。
这是主要代码
这是界面
这是基础披萨
这是装饰器类
成分类之一是
其他人看起来像他们。
现在,我想从用户那里获取他们想要的输入。为了输入,我将创建比萨饼。他们可能只想要普通的披萨。但是从那以后,我创建了我的披萨 -> Pizza p = new TomatoSauce(new Mozarella(new PlainPizza())); 像这样。如何制作动态披萨?我是否必须使用 if-else 或 switch-case 检查每个条件?
c# - 如何在以下场景中使用 Autofac 实现装饰器模式
我需要使用 Autofac 实现装饰器模式。
我有两个具有自己实现的类/服务。现在基于一个条件,我需要能够动态调用任一服务类来获取数据。
目前我已经注册了 ServiceClassA 和 ServiceClassB,如下所示
从控制器 (ControllerClass) 中调用 ServiceClassA,如下所示
进行上述调用时,应根据条件(日期 > 31st March 2020 )调用 ServiceClassB 中的方法 B。为了实现这一点,我们的技术架构师认为 Autofac 的装饰器模式是对现有代码流影响不大的解决方案。
所以我对 ServiceClassA 注册进行了以下更改
完成上述步骤后,我被卡住了,不知道如何应用条件。在stackoverflow上检查了很多答案,以找到无法解决的解决方案。
design-patterns - 如何使用装饰器模式构建东西对象?
我对装饰器模式有一些疑问。据我了解,装饰器模式的存在是为了向对象添加行为,即“装饰对象”,因此您可以组合不同的对象,而无需实现大量不同的类,只需进行微小的更改,从而导致“类爆炸” ”。
现在的问题是,一般化的装饰器模式说我们应该有一个基类,然后我们的装饰器类扩展它,但也可以从中进行委托。所以装饰器本质上“是一个”和“有一个”基类(以及它的方法)。
问题就来了,因为让我们说我想为一个游戏组成一个“玩家”,实际上有很多不同的玩家,而且都有微小的变化。然后我可能想使用装饰器模式(?)并说“好吧,我们的基类是普通人”。我想用枪和防弹衣装饰这个人。然后我的装饰器类 gun 将实现与人类相同的方法,让我们说“吃”。但是我的枪肯定不会吃,我只希望它能够射击。我可以通过返回 null 或其他东西来解决这个问题,但这也会破坏接口隔离原则。
那么我如何在不破坏 ISP 的情况下解决这个问题,同时又不需要创建大量更改最小的类,例如“带枪的人”、“带枪和防弹衣的人”、“带工作人员和防弹衣的人”, “人与员工”,你明白了。
django - 在 Django 中间件中实现了哪种模式?(责任链或装饰者)
我试图弄清楚 Django Middleware 中使用了什么模式。也许有模式的组合?
inheritance - 装饰器模式的继承
在装饰器模式中,一个抽象类实现一个接口,一个具体类(装饰器)扩展抽象类。如果具体类直接实现接口而不是通过抽象类继承接口,模式的功能会发生什么?