繁体   English   中英

门面设计模式和紧密耦合

[英]Facade design pattern and close coupling

学习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类和Systems(SystemA和SystemB)之间创建紧密耦合,即使SystemA和SystemB是从某个抽象类或接口继承的。

在某种程度上你编写了你的​​例子,是的,它将紧密地结合你的代码。 主要是由于new关键字对你的依赖关系起着glue作用。

请记住,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();
 }
}

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

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

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

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

我建议你阅读更多关于依赖注入和容器的内容,这将极大地帮助你包装类的依赖图并自动化该类中的构造函数注入。

外观模式隐藏了系统的复杂性,并为客户端提供了访问系统的接口。
典型的例子是编译器,而作为客户端,您可以调用编译方法,但是您没有看到内部步骤,如扫描,解析,...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM