c# - 门面设计模式与紧耦合

标签 c# design-patterns

在学习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 关键字对您的依赖项起到了胶水的作用。

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

如果你想避免紧耦合,你需要在你的 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/

相关文章:

c# - 使用 Linq-to-SQL 访问存储过程

c# - 线程在 IIS 上托管的 WCF 应用程序内随机停止

c# - yield 返回 IEnumerator 或 IEnumerable

c# - 策略模式还是命令模式?

web-services - 使用不同版本的 Web 服务的设计模式?

c# - AvPlayer 正在下载 mp3 而不是流式传输

Javascript - 将 ISO8601 UTC 时间转换为客户端的本地时间

design-patterns - Rust 结构模式,在 hashmap 中存储多个工厂

c# - 修改父行为的访问者的层次结构。 Liskov 还好吗?

c# - Windows ocr 可以识别自定义符号/字体吗?