最近,我了解了如何动态扩展现有行为的装饰器模式。所以我有个密码:
IMyInterface b = new A();
if(someCondition)
b = new B(b);
if(secondCondition)
b = new C(b);依此类推,所有类A、B和C都实现了IMyInterface,B和C是装饰者。因此,在上面的示例中,对方法的最后请求可能最多由三个实例处理。
不过,我现在想在代码中插入一个修饰器,因为我有一些插件机制,可以将产品代码从特定于项目的代码中分离出来。这就是为什么我对B和C一无所知。因此,我想要一种返回我的接口的装饰实例的方法,以一种可以链接多个插件从而连接多个装饰器的方式:
IMyInterface b = new A();
/* collect the decorators from all plugins and chain them to get the final instance */有没有人对如何创建这些实例有一个好的想法?
发布于 2020-05-06 17:22:24
那么,如果您不喜欢直接知道您在编写哪些装饰器,那么您可以尝试一个重构:用多态替换条件。
为每个装饰师提供一个工厂类,以供其居住的建筑代码使用:
class MyInterfaceFactoryB : MyInterfaceFactory {
IMyInterface Decorate(IMyInterface a) {
return new B(a);
}
}
class MyInterfaceFactoryC : MyInterfaceFactory {
IMyInterface Decorate(IMyInterface a) {
return new C(a);
}
}用工厂来填写一份清单。每个插件都会对此做出贡献。
List<MyInterfaceFactory> decorators = new List<MyInterfaceFactory>();
decorators.add(new MyInterfaceFactoryB());
decorators.add(new MyInterfaceFactoryC());现在建造装潢师。
IMyInterface chain = new A();
foreach (MyInterfaceFactory decorator in decorators) {
chain = decorator.Decorate(chain);
}这个链子已经准备好了。
这将使您将了解A的代码与了解B和C的代码分开。
https://softwareengineering.stackexchange.com/questions/409786
复制相似问题