此模式相对而言简单一些,比较容易理解,我们先来举个司机和公交汽车的例子:
我们试想有这么一种情况,如果公交车没有那样的一排控制面板,那么我们的司机能不能将公交发动起来,也就是说我们的公交司机要自己跟制动系统,跟声音系统,跟制冷系统......亲自打交道;如果将来公交车的某个子系统坏了,换了一个其他能代替原先子系统功能的新的子系统,那么我们的司机要得要重新学习如何让这个子系统工作系统......
我们可以用一幅图来粗略的表示上说的那种情形:

A方案很类似我们上述的那种情形,方框内的多个方块代表某个系统的子系统,这些子系统相互之间存在着联系;这些子系统组成了完整的系统;外部的方块代表客户客户程序,可能某个客户程序只与其中某个几个子系统方式联系;那么如果我们的子系统发生变化,必然会影响到我们的客户程序,客户程序也要跟着改变。
B 方案提供了一种好的解决方案:在我们的客户程序和子系统之间提供了一层沟通机制,也就是一个统一的操作面,或者说是一个高层接口,使得这些子系统更容易操作;更有意义的是将我们的客户程序和子系统之间进行了解耦。
概述:
在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?
意图:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。----GOF 《设计模式》
结构图:

我们就以模拟司机开公交车为例来说明这个模式:
假设司机要操作公交车,需要操作制动,声音,制冷三个系统。
如果我们在没有使用此模式,而直接访问这些子系统,我们的代码可能是这样一种结构:
首先,我们可以确定下来的应该是司机,制动,声音,制冷这几个类,如下:
public class Motoman
{
string name;
public Motoman(string name)
{
this.name = name;
}
public string Name
{
set
{
name = value;
}
get
{
return name;
}
}
}
public class Mechanism
{
public void StartUp(Motoman man)
{
Console.WriteLine(man.Name+" is Starting Up the System");
}
}
public class RefrigerationSystem
{
public void StartUp(Motoman man)
{
Console.WriteLine(man.Name+" is Starting Up the System");
}
}
public class SoundSystem
{
public void StartUp(Motoman man)
{
Console.WriteLine(man.Name+" is Starting Up the System");
}
}
下面看看我们的客户程序调用:
Motoman man = new Motoman("motomanA");
RefrigerationSystem refrigerationSys = new RefrigerationSystem();
SoundSystem soundSys = new SoundSystem();
Mechanism mechSys = new Mechanism();
mechSys.StartUp(man);
refrigerationSys.StartUp(man);
soundSys.StartUp(man);
在这种情况下,客户程序与三个子系统都发生了耦合;客户程序直接依赖于子系统,将来子系统发生变化时,客户程序面临着很多变化的挑战;下面我们来做个改进,为这些子系统创建一个统一的接口,客户程序直接访问此接口,此接口简化了客户程序的操作。
我们的Facade类:
public class SysFacade
{
private RefrigerationSystem refrigerationSys = new RefrigerationSystem();
private SoundSystem soundSys = new SoundSystem();
private Mechanism mechanismSys = new Mechanism();
public void StartUp(Motoman man)
{
//
mechanismSys.StartUp(man);
//
refrigerationSys.StartUp(man);
//
soundSys.StartUp(man);
//

}
}
此时我们的客户调用:
Motoman man = new Motoman("motomanA");
SysFacade facade = new SysFacade();
facade.StartUp(man);
这个时候我们就发现,我们的客户程序只与SysFacade 发生依赖,从而实现了客户程序与子系统复杂内部结构的解耦。这就是我们的Facade模式。
我们试想有这么一种情况,如果公交车没有那样的一排控制面板,那么我们的司机能不能将公交发动起来,也就是说我们的公交司机要自己跟制动系统,跟声音系统,跟制冷系统......亲自打交道;如果将来公交车的某个子系统坏了,换了一个其他能代替原先子系统功能的新的子系统,那么我们的司机要得要重新学习如何让这个子系统工作系统......
我们可以用一幅图来粗略的表示上说的那种情形:

A方案很类似我们上述的那种情形,方框内的多个方块代表某个系统的子系统,这些子系统相互之间存在着联系;这些子系统组成了完整的系统;外部的方块代表客户客户程序,可能某个客户程序只与其中某个几个子系统方式联系;那么如果我们的子系统发生变化,必然会影响到我们的客户程序,客户程序也要跟着改变。
B 方案提供了一种好的解决方案:在我们的客户程序和子系统之间提供了一层沟通机制,也就是一个统一的操作面,或者说是一个高层接口,使得这些子系统更容易操作;更有意义的是将我们的客户程序和子系统之间进行了解耦。
概述:
在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?
意图:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。----GOF 《设计模式》
结构图:

我们就以模拟司机开公交车为例来说明这个模式:
假设司机要操作公交车,需要操作制动,声音,制冷三个系统。
如果我们在没有使用此模式,而直接访问这些子系统,我们的代码可能是这样一种结构:
首先,我们可以确定下来的应该是司机,制动,声音,制冷这几个类,如下:
public class Motoman
{
string name;
public Motoman(string name)
{
this.name = name;
}
public string Name
{
set
{
name = value;
}
get
{
return name;
}
}
}
public class Mechanism
{
public void StartUp(Motoman man)
{
Console.WriteLine(man.Name+" is Starting Up the System");
}
}
public class RefrigerationSystem
{
public void StartUp(Motoman man)
{
Console.WriteLine(man.Name+" is Starting Up the System");
}
}
public class SoundSystem
{
public void StartUp(Motoman man)
{
Console.WriteLine(man.Name+" is Starting Up the System");
}
}
Motoman man = new Motoman("motomanA");
RefrigerationSystem refrigerationSys = new RefrigerationSystem();
SoundSystem soundSys = new SoundSystem();
Mechanism mechSys = new Mechanism();
mechSys.StartUp(man);
refrigerationSys.StartUp(man);
soundSys.StartUp(man);我们的Facade类:
public class SysFacade
{
private RefrigerationSystem refrigerationSys = new RefrigerationSystem();
private SoundSystem soundSys = new SoundSystem();
private Mechanism mechanismSys = new Mechanism();
public void StartUp(Motoman man)
{
//
mechanismSys.StartUp(man);
//
refrigerationSys.StartUp(man);
//
soundSys.StartUp(man);
//

}
}
Motoman man = new Motoman("motomanA");
SysFacade facade = new SysFacade();
facade.StartUp(man);
浙公网安备 33010602011771号