【问题标题】:Facade design pattern and close coupling外观设计模式和紧密耦合
【发布时间】:2017-03-30 06:33:22
【问题描述】:

在学习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 是从某个抽象类或接口继承的。

【问题讨论】:

  • 如果你想抽象出系统——你可以这样做。它只是与外观模式的作用无关,因此没有理由通过添加额外的接口来使示例复杂化。

标签: c# design-patterns


【解决方案1】:

以您编写示例的方式,是的,它将紧密耦合您的代码。主要是因为 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();
 }
}

你需要创建接口(或抽象类):

public interface ISystemA
{
 void CreateCreditCard();
 //other methods here
}

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

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

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

【讨论】:

    【解决方案2】:

    Facade patterns,隐藏了系统的复杂性,并为客户端提供了一个可以访问系统的接口。
    典型的例子是编译器,作为客户端你可以调用 compile 方法,但你看不到扫描、解析等内部步骤......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 2014-12-10
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      相关资源
      最近更新 更多