在学习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是从某些摘要继承的类或接口。
答案 0 :(得分:4)
在某种程度上你编写了你的例子,是的,它将紧密地结合你的代码。主要是由于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
接口的实现。
我建议你阅读更多关于Dependency Injection和容器的内容,这些内容将极大地帮助你包装类的依赖图并在这些类中自动化构造函数注入。
答案 1 :(得分:0)
Facade patterns,隐藏了系统的复杂性,并为客户端提供了一个客户端可以访问系统的接口。
典型的例子是编译器,而作为客户端,您可以调用编译方法,但是您没有看到内部步骤,如扫描,解析,......