设计模式=外观模式
1 外观模式Facade
定义:提供系统一组接口的一个一致的界面,此模式定义了一个高层接口,这个接口使得这个子系统更加容易使用。
理解:
外观模式作为结构型模式中的一个简单又实用的模式,外观模式通过封装细节来提供大粒度的调用,直接的好处就是,封装细节,提供了应用写程序
的可维护性和易用性。外观模式一般应用在系统架构的服务层中,当我们是多个不同类型的客户端应用程序时,比如一个系统既可以在通过Web的形式访
问,也可以通过客户端应用程序的形式时,可能通过外观模式来提供远程服务,让应用程序进行远程调用,这样通过外观形式提供服务,那么不管是什么样
的客户端都访问一致的外观服务,那么以后就算是我们的应用服务发生变化,那么我们不需要修改没一个客户端应用的调用,只需要修改相应的外观应用即
可。
内容:外观对象,子系统类
作用:
1、我们在使用第三方类库或者API的时候,我们通过本地的API接口的封装,来完成对第三方API接口的粗粒度外观对象,通过这个外观对象可以很容
易的完成服务的调用。我们这里举例说明吧,例如现在我有一个发送手机短信的API接口,是第三方提供给我的API接口,那么我如何包装呢?
下面给出对API封装的相关代码和说明
public class MessageHelper
{
private static readonly MessageHelper instance = new MessageHelper();
#region API接口
[DllImport("EUCPComm.dll", EntryPoint = "SendSMS")] //即时发送
private static extern int SendSMS(string sn, string mn, string ct, string priority);
[DllImport("EUCPComm.dll", EntryPoint = "SendSMSEx")] //即时发送(扩展)
private static extern int SendSMSEx(string sn, string mn, string ct, string addi, string priority);
[DllImport("EUCPComm.dll", EntryPoint = "SendScheSMS")] // 定时发送
private static extern int SendScheSMS(string sn, string mn, string ct, string ti, string priority);
#endregion
#region 对上面的API包装后的方法
public int SendSMSEx1(string sn, string mn, string ct, string addi, string priority)
{
return SendSMSEx(sn, mn, ct, addi, priority);
}
public int SendSMS1(string sn, string mn, string ct, string priority)
{
return SendSMS(sn, mn, ct, priority);
}
public int SendScheSMS1(string sn, string mn, string ct, string ti, string priority)
{
return SendScheSMS(sn, mn, ct, ti, priority);
}
#endregion
}
相关的测试代码:
static void Main(string[] args)
{
//相关的测试代码
//调用外观对象中的服务
MessageHelper.instance.SendSMS1("", "", "", "");
}
2、我们在架构设计的过程中,一次的功能访问可能需要同时的调用很多个对象,那么如果我们在服务调用的时候,能够在应用程序调用中一次就能完
成所有要同时调用的对象那该多好啊,外观模式无疑是最好的原则,特别是在分布式应用中,通过远程调用服务,通过外观模式降低应用程序与服务的交互
次数,同时可以降低应用程序的复杂性。外观模式+DTO,提供远程服务调用的性能,这些都是好的设计方式。我们来看看简单的示例吧,我想我们更
能了解其中的奥妙。看图说话吧,我们这里以一次远程同步服务为例。
未使用外观模式前:
一个简单的同步服务,由于应用程序在这次服务中为了完成同步操作,必须进行3次远程连接来进
行把3个对象进行同步,那么如果我们使用外观对象之后呢,我们只需要访问一次即可完成3个对象的同步。这无疑提高了系统的性能和效率。
并且通过DTO来进行传输的话,可以提供远程服务调用的访问此时和效率
UML图:
其他:
我们这里先给出一个外观模式的原理图:
这是未使用外观模式之前的情况,下面给出使用外观模式后的情形:
通过外观对象来组织细粒度的服务的调用,外观对象提供给外部应用程序可
以使用的服务,而具体的调用细粒度的过程则被外观对象给封装起来,当然这个过程就是封装变化的部分,而将变化的部分与应用程序进行隔离,无疑对程
序的易用性和可维护性都是很大的提高。
demo:第三方API调用