Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 立面设计模式与紧密耦合_C#_Design Patterns - Fatal编程技术网

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
}