在学习 Facade 设计模式时,到处都能找到这样的例子:

public class SystemA
{
 public void CreateCreditCard(){//implementation}
 //other methods here
}

public class SystemB
{
 public void CheckCreditCard(){//implementation}
//other methods here
}

public class Facade
{
 SystemA subsystemA = new SystemA();
 SystemB subsystemB = new SystemB();

 public void CreateAccount()
 {
   subsystemA.CreateCreditCard();
   subsystemB.CheckCreditCard();
 }
}

我不知道我是否错了,但它不会在 Facade 类和系统(SystemA 和 SystemB)之间创建紧密耦合,即使 SystemA 和 SystemB 是从某个抽象类或接口(interface)继承的。

最佳答案

以您编写示例的方式,是的,它会紧密耦合您的代码。主要是由于 new 关键字对您的依赖项就像 glue 一样。

请记住,外观模式不会阻止您创建紧密耦合的依赖项或代码。使用它的主要目的是使您的软件组件更易于使用、更具可读性和可维护性,最后但并非最不重要的是更易于测试。

如果要避免紧耦合,则需要在 Facade 类中传递抽象依赖项:

public class Facade
{
 private readonly ISystemA subsystemA;
 private readonly ISystemB subsystemB;

 public Facade(ISystemA subsystemA, ISystemB subsystemB)
 {
    this.subsystemA = subsystemA;
    this.subsystemB = subsystemB;
 }

 public void CreateAccount()
 {
   this.subsystemA.CreateCreditCard();
   this.subsystemB.CheckCreditCard();
 }
}

您需要创建接口(interface)(或抽象类):
public interface ISystemA
{
 void CreateCreditCard();
 //other methods here
}

public interface ISystemB
{
  void CheckCreditCard();
  //other methods here
}

通过这种方式,您可以确保您的 Facade 不依赖于实现,而是依赖于抽象。您将能够传递任何实现 ISystemAISystemB 接口(interface)的实现。

我建议您阅读有关 Dependency Injection 和容器的更多信息,这将极大地帮助您包装类的依赖关系图并在该类中自动注入(inject)构造函数。

关于c# - 外观设计模式和紧密耦合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43110218/

10-13 01:59