3

我正在使用提供 API 的第三方产品。此 API 通过创建基类的实现来工作,然后在 app.config 中指示您要使用的实现。

这样做的问题是,在这个第三方应用程序中可能有多个项目。我想做的是创建一个实现基类的包装类。这将查看参数,然后查找配置以确定将处理传递给哪个其他类,具体取决于正在使用的项目。这样我们就可以在不修改任何现有代码的情况下将未来的项目添加到系统中。

public class MyImplementation : ThirdPartyBaseClass
{
    public override OnLoad(ThirdPartyType data)
    {
        //do stuff
    }

    public override Process(ThirdPartyType data)
    {
        //do stuff
    }
}

大约有 15 种方法可以被覆盖。基类方法似乎是空的,因为如果你不重写一个方法,什么都不会发生,所以我需要我的包装器能够处理我需要用于这个项目的类型可能无法实现部分或全部的情况方法。

有人知道适合这种情况的设计模式吗?

4

3 回答 3

2

正如罗伯特在评论中所说,抽象工厂似乎适合这个。查看此wiki 链接和此dofactory 链接以获取有关此链接的更多信息。

对于更具体的回应,我有一些疑问。有一个从第三方 API 获取的基类对象。现在,当您说这个工具中可以有多个项目时,我是否认为您需要使用这个基类来创建您定义的多个“项目”类?

然后,包装类可以具有接口的对象类型IProject。这应该有所有的定义,比如OnLoadand Process。每种类型的项目都有一个具体的类,最终实现取决于项目类型。

希望这有助于给你一个方向!

于 2012-09-06T11:34:56.857 回答
0

我认为使用好的 DI 容器(如 Autofac)甚至是穷人的 DI 都可以很容易地实现这一点。您可以根据您选择的任何标准在运行时选择要提供的服务,并将其作为您通过构造函数注入实现第三方 API 类的具体实现。

于 2012-09-06T00:43:38.303 回答
0

装饰器模式和抽象工厂模式可能会在这方面对您有所帮助。我建议app.config使用具体工厂(取决于当前配置)来获取装饰器的装饰器(您在其中配置的实现) inner

如果您想一次使用多个实现,您还可以考虑使用复合模式将调用委托给多个inner.

于 2012-09-06T13:34:39.123 回答