我有一个只有接口和基本对象的库,我们称之为API。 API有一些已知的实现,可能会增加数量以满足应用程序的需求。应用程序一次只能使用一个实现。我有另一个库,我们称之为PROXY,它提供了API库的基本实现,并将逻辑委托给API的实际实现。真正的实现由配置提供,PROXY库负责创建适当的真实类并包装它们。我的想法是在我的代码中使用API和PROXY库,这样我就可以在不重新编译应用程序的情况下更改实现 - 只需更改配置并在类路径中提供真正的实现库。以下是C#中的示例代码:
API:
public interface IFoo
{
void Bar();
}
PROXY:
public class Foo : IFoo
{
private IFoo _realFoo;
public Foo()
{
_realFoo = ...; // Assume reading the config and creating the real implementation with reflection here.
}
void Bar()
{
_realFoo.Bar();
}
}
真正的实施:
public class RealFoo : IFoo
{
void Bar()
{
// Some specific logic
}
}
我猜上面的Foo类使用Decorator Pattern
来包装实际的实现。如果整个方法都有一个特定的名称,我会更感兴趣吗?
答案 0 :(得分:3)
这不是出于多种原因而使用Decorator模式,最重要的是出于意图。
这是一个代理。通常是代理模式
为另一个要控制的对象提供代理或占位符 访问它
您使用它来动态加载实现,因此与基于配置的实现松散耦合也使其类似于依赖注入。您的版本不同之处在于您在中间有一个代理对象。相反,如果您的客户端持有对RealFoo的引用,但此引用是通过您正在讨论的那种机制获得的,那么这将更接近地匹配依赖注入。
答案 1 :(得分:1)
我使用IoC / DI完全相同的东西和Castle Windsor作为我的IoC容器。
答案 2 :(得分:1)
我认为您将Proxy模式与某种工厂方法模式混合在一起。
在普通代理模式中,代理对象本身不会创建主目标。但是,一些应该创建目标类型对象的Factory类创建目标实例并将其传递给代理实例,最后返回代理。
还有不同的方法来创建代理对象。例如,看看Castle Dynamic Proxy,这是为了提供ASPECTS。