C# 立面设计模式与紧密耦合
在学习门面设计模式时,我到处都能找到这样的例子:C# 立面设计模式与紧密耦合,c#,design-patterns,C#,Design Patterns,在学习门面设计模式时,我到处都能找到这样的例子: public class SystemA { public void CreateCreditCard(){//implementation} //other methods here } public class SystemB { public void CheckCreditCard(){//implementation} //other methods here } public class Facade { SystemA
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是从某个抽象类或接口继承的。以您编写示例的方式,是的,它会紧密耦合您的代码。这主要是由于
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();
}
}
您需要创建接口(或抽象类):
通过这种方式,您确保了您的外观不依赖于实现,而是依赖于抽象。您将能够通过任何实现ISystemA
或ISystemB
intefaces的实现
我建议您阅读更多关于和容器的信息,这些信息将极大地帮助您包装类的依赖关系图,并在这些类中自动注入构造函数。,隐藏系统的复杂性,并提供一个客户端可以访问系统的接口。典型的例子是编译器,而作为客户机,您可以调用compile方法,但如果您想抽象出系统,您看不到诸如扫描、解析等内部步骤—您可以这样做。这与facade模式的功能无关,因此没有理由通过添加额外的接口来使示例复杂化。
public interface ISystemA
{
void CreateCreditCard();
//other methods here
}
public interface ISystemB
{
void CheckCreditCard();
//other methods here
}