1

这是情况。我们有两台来自不同供应商(制造商)的打印机。我们希望顶级代码不了解有关提供者的详细信息,而只使用统一的 API。所以我开始提取一个接口。

public interface IPrinterProvider {
    bool Connect(string comPort);
    bool IsConnected();
}

好的。现在,我意识到一台打印机需要密码属性,而另一台不需要。所以我该怎么做?

再一次。据我了解,我将拥有一个或几个接口和几个实现器。但是调用者将如何工作?我应该创建一个单独的类,它可能不实现任何接口吗?例如:

public class CommonPrinterProvider {
    private IPrinterProvider printerProvider;
    public CommonPrinterProvider(IPrinterProvider printerProvider) {
        this.printerProvider= printerProvider;
    }
}

所以,一共两个问题。

4

5 回答 5

5

我会将打印机“设置”(或更准确地说,“连接设置”)封装到另一个类中,并将其保存在interface. 有点像这样:

public class PrinterSettings {
    public string Password { get; set; }
    public int Port { get; set; }
    /* .. others .. */
}

public interface IPrinterProvider {
    void Initialize(PrinterSettings settings);
    bool Connect(string comPort);
    bool IsConnected();
}

然后每个实现都可以以他们认为合适的任何方式处理设置。

于 2013-08-01T09:20:07.580 回答
1

最好尽量统一你的界面。当然接口实现(类)会有差异,但处理它们应该隐藏在策略中。调用者应该使用接口,最好将实例化到IoC层。下一步将是创建服务,为特定实现带来所有需要的设置。每个服务类型将由每个单独的提供者使用。然后你会有一个不错的SOC。在这个级别,您将拥有具有相同接口的并行结构并实现一个抽象工厂,这是一个完美的选择。

于 2013-08-01T09:17:40.893 回答
1

一种方法是提供IPrinterProvider. 这个新界面将具有密码添加将添加的所有属性等:

public interface IPrinterProvider
{
    bool Connect(string comPort);
    bool IsConnected();
}

public interface IPasswordPrinterProvider : IPrinterProvider
{
    string Password { get; set; }
}

这样继承的接口包含所有相同的东西IPrinterProvider,但也扩展了它自己的东西。IPrinterProvider那些没有密码选项实现原始的类将没有负担。

于 2013-08-01T09:30:50.413 回答
0

你可以让你的界面保持原样并实现一个接收密码的类和另一个不接收密码的类:

public class PasswordPrinterProvider : IPrinterProvider
{
     private readonly string password;
     public PasswordPrinterProvider(string password)
     {
         this.password = password;
     }
     public bool Connect(string comPort) {...}
     public bool IsConnected() {...}
}
于 2013-08-12T11:13:09.940 回答
-1

你可以使用这样的东西......有点类似于工厂模式。

抽象类:

public abstract class PrinterProvider
{
    public string Password{get;private set;}
    public abstract bool connect(string port);
    public bool IsConnected()
    {
        return true;
    }
}

混凝土类 1:

public class PrinterCompany1 : PrinterProvider
{
    public override bool connect(string port)
    {
        // some code here
        // If it needs password
        return true;
    }
}

混凝土类 2:

public class PrinterCompany2:PrinterProvider
{
    // Printer that doesnt need password
    public override bool connect(string port)
    {
        return false;
    }
}

最后在动态多态的帮助下访问所有这些具体的类......

        PrinterProvider provider;

        // First provider
        provider = new PrinterCompany1();
        provider.connect("temp");
        // Second provider
        provider = new PrinterCompany2();
        provider.connect("temp2");

有关详细说明,请参阅工厂模式...

于 2013-08-01T09:39:12.970 回答