[英]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不依赖于实现,而是依赖于抽象。 您将能够传递任何实现ISystemA
或ISystemB
接口的实现。
我建议你阅读更多关于依赖注入和容器的内容,这将极大地帮助你包装类的依赖图并自动化该类中的构造函数注入。
外观模式隐藏了系统的复杂性,并为客户端提供了访问系统的接口。
典型的例子是编译器,而作为客户端,您可以调用编译方法,但是您没有看到内部步骤,如扫描,解析,...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.