在学习 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 不依赖于实现,而是依赖于抽象。您将能够传递任何实现
ISystemA
或 ISystemB
接口(interface)的实现。我建议您阅读有关 Dependency Injection 和容器的更多信息,这将极大地帮助您包装类的依赖关系图并在该类中自动注入(inject)构造函数。
关于c# - 外观设计模式和紧密耦合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43110218/