外观模式
在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?
Facade模式为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
如有两个类:
public class ServiceA {
public void methodA(){
......................
}
}
public class ServiceB {
public void methodB(){
......................
}
}
不使用外观模式时的调用程序:
public class MainApp
{
public static void Main()
{
ServiceA sa = new ServiceA();
ServiceB sb = ServiceA ();
sa.methodA();
sb.methodB();
}
}
使用外观模式调用程序
public class Facade {
ServiceA sa;
ServiceB sb;
public Facade(){
sa = new ServiceAImpl();
sb = new ServiceBImpl();
}
public void methodA(){
sa.methodA();
sb.methodB(); }
}
public class MainApp
{
public static void Main()
{
Facade facade = new Facade();
facade.methodA();
}
}
可以看到引入Facade模式后,蔽了子系统之间的复杂的操作,达到了解耦内部子系统与客户程序之间的依赖。
Facade模式在实际开发中最多的运用当属开发N层架构的应用程序了,N层构架一般分为UI层,业务层,数据层:
1.uI层负责将用户输入的数据传入到业务层进行处理,并将传回的数据显示到界面上。
2.业务层负责将UI层传过来的数据进行业务逻辑处理并与数据层进行数据交互
3.数据层负责对数据库的访问
要点:
1. 外观模式为复杂子系统提供了一个简单接口,并不为子系统添加新的功能和行为。
2. 外观模式实现了子系统与客户之间的松耦合关系。
3. 外观模式没有封装子系统的类,只是提供了简单的接口。如果应用需要,它并不限制客户使用子系统类。因此可以在系统易用性与通用性之间选择。
4. 外观模式注重的是简化接口,它更多的时候是从架构的层次去看整个系统,而并非单个类的层次。