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