这是一种设计模式,它有一个共同的名称吗?

时间:2011-12-07 16:54:31

标签: design-patterns

我有一个只有接口和基本对象的库,我们称之为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来包装实际的实现。如果整个方法都有一个特定的名称,我会更感兴趣吗?

3 个答案:

答案 0 :(得分:3)

这不是出于多种原因而使用Decorator模式,最重要的是出于意图。

这是一个代理。通常是代理模式

  

为另一个要控制的对象提供代理或占位符   访问它

您使用它来动态加载实现,因此与基于配置的实现松散耦合也使其类似于依赖注入。您的版本不同之处在于您在中间有一个代理对象。相反,如果您的客户端持有对RealFoo的引用,但此引用是通过您正在讨论的那种机制获得的,那么这将更接近地匹配依赖注入。

答案 1 :(得分:1)

我使用IoC / DI完全相同的东西和Castle Windsor作为我的IoC容器。

http://martinfowler.com/articles/injection.html

答案 2 :(得分:1)

我认为您将Proxy模式与某种工厂方法模式混合在一起。

在普通代理模式中,代理对象本身不会创建主目标。但是,一些应该创建目标类型对象的Factory类创建目标实例并将其传递给代理实例,最后返回代理。

还有不同的方法来创建代理对象。例如,看看Castle Dynamic Proxy,这是为了提供ASPECTS。