设计模式-门面模式

就象字面含义一样,门面模式的作用是为了简化用户对一系列相关对象及操作的使用。比如用户买包子,馒头一样,用户并不需要知道包子,馒头的制造过程和细节,也不需要进入厨房,而只需要在门面,向服务员进行购买,拿包子,找钱,打包的事情都有服务员来完成,用户最后只需要得到要买的东西和找零的钱即可。门面模式将一系列复杂而相关的操作封装成一个简单的操作接口。比如就编译子系统来说,有很多的操作如,词法扫描、语法分析等,这些操作都由不同的对象来负责。
但对于编译系统来说,它不需要知道这些子系统的具体实现细节,它关心的是怎样完成编译操作。这时,我们就可以为编译系统定义一个简单的接口,由这个接口来组合负责相关操作的对象来协同工作,完成编译工作。

门面模式的核心是为了简化操作接口,使系统变得易用。

下面是个例子:

#endregion
/// <summary>
/// Facade 的摘要说明。
/// </summary>
public class Facade
{
public Facade()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public void DoSomething()
{
Facade_Opt1 opt1 = new Facade_Opt1();
Facade_Opt2 opt2 = new Facade_Opt2();
Facade_Opt3 opt3 = new Facade_Opt3();
opt1.DoSomething();
opt2.DoSomething();
opt3.DoSomething();
}
}
public class Facade_Opt1
{
public void DoSomething()
{
;
}
}
public class Facade_Opt2
{
public void DoSomething()
{
;
}
}
public class Facade_Opt3
{
public void DoSomething()
{
;
}
}

门面模式没有相对固定的结构模式,但在设计中十分常用,特别是用户交互设计中。用户不需要知道系统内部的处理业务逻辑的细节,而只关心输入和结果是否正确。比如数据库连接,用户只需要填入用户名和密码,然后调用一个接口进行连接,至于数据库连接的过程,如密码加密,解密,所采用的数据库链路之类的,用户一般都不会关心,而由门面服务来完成。

门面模式也为一系列服务对象提供不同的服务提供了一种组合途径。

与其它模式的关系:

1)代理模式:两种模式都起到一种“代理”的作用。代理模式是为一个对象提供一种控制访问该对象的一种机制,并不改变对象的接口。而门面模式是为一系列相关的对象的访问,提供一种简化的访问接口,代理对象需要实现被代理者的接口,而门面模式的门面对象则不需要。

2)代理模式,装饰模式,策略模式,桥模式等都是为了增加或者改变对象的功能或者行为,而且改变的对象都是一类的。而门面模式并不改变对象的接口和功能,只是对外提供一种新的简化了的接口,对内则协调各个对象之间的操作。

3)适配器模式改变了对象的接口,起到了标准兼容的作用,门面模式从外面看,也改变了访问这些对象的方式,但门面模式并不改变某个对象的接口,提供的访问接口只是为了简化对这一系列对象的访问。门面模式提供了一种协同工作的方式。

后记:门面模式的根本动力在于,我们在设计中为了共用或者复用,底层的很多业务逻辑(可以看做是零件逻辑)并不单纯只是为了某个特定的应用,为了公用或者复用,显得碎化,再提供给外部使用的时候,就需要根据需要进行组装,为了减少用户对这个组装的依赖,往往提供一系列的组合接口(也就是门面接口)给外部使用。门面模式在实际生活中处处可见,组件化编程其实也源于这种思想。制造业中零件-组件-成品的制造过程也是这种思想的体现,而且提供了很大的灵活性。当然,为了支持这种设计模式,底层的零件逻辑或者是组件逻辑需要分割合理,接口要标准,而且在连接和事务处理方面也要考虑周详。

你可能感兴趣的:(设计模式)