首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >注入解码器

注入解码器
EN

Software Engineering用户
提问于 2020-05-06 15:41:40
回答 1查看 87关注 0票数 2

最近,我了解了如何动态扩展现有行为的装饰器模式。所以我有个密码:

代码语言:javascript
复制
IMyInterface b = new A();
if(someCondition)
    b = new B(b);
if(secondCondition)
    b = new C(b);

依此类推,所有类ABC都实现了IMyInterfaceBC是装饰者。因此,在上面的示例中,对方法的最后请求可能最多由三个实例处理。

不过,我现在想在代码中插入一个修饰器,因为我有一些插件机制,可以将产品代码从特定于项目的代码中分离出来。这就是为什么我对BC一无所知。因此,我想要一种返回我的接口的装饰实例的方法,以一种可以链接多个插件从而连接多个装饰器的方式:

代码语言:javascript
复制
IMyInterface b = new A();
/* collect the decorators from all plugins and chain them to get the final instance */

有没有人对如何创建这些实例有一个好的想法?

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2020-05-06 17:22:24

那么,如果您不喜欢直接知道您在编写哪些装饰器,那么您可以尝试一个重构:用多态替换条件。

为每个装饰师提供一个工厂类,以供其居住的建筑代码使用:

代码语言:javascript
复制
class MyInterfaceFactoryB : MyInterfaceFactory { 
    IMyInterface Decorate(IMyInterface a) { 
        return new B(a); 
    } 
}
class MyInterfaceFactoryC : MyInterfaceFactory { 
    IMyInterface Decorate(IMyInterface a) { 
        return new C(a); 
    } 
}

用工厂来填写一份清单。每个插件都会对此做出贡献。

代码语言:javascript
复制
List<MyInterfaceFactory> decorators = new List<MyInterfaceFactory>();

decorators.add(new MyInterfaceFactoryB());
decorators.add(new MyInterfaceFactoryC());

现在建造装潢师。

代码语言:javascript
复制
IMyInterface chain = new A();
foreach (MyInterfaceFactory decorator in decorators) {
    chain = decorator.Decorate(chain);
}

这个链子已经准备好了。

这将使您将了解A的代码与了解B和C的代码分开。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/409786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档