外观模式
在外观模式中,一个子系统的外部与其内部的通信通过一个统一的外观类进行,外观类将客户端与子系统内部复杂性分隔开,使得客户端只需要与外观角色打交道,而不需要与子系统内部的很多对象打交道。
外观模式结构:
1.Facade(外观角色):在客户端可以调用它的方法,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任。在正常情况下,它将调用从客户端发来的请求委派到相应的子系统,传递给相应的子系统对象处理。
2. SubSystem(子系统角色):在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,他实现子系统的功。每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理有外观类传来的请求,子系统并不知道外观角色的存在,对于子系统而言,外观角色仅仅是另外的一个客户端而已。
外观模式的简单实现:
外观模式中所指的子系统是一个广义的概念,它可以使一个类,一个功能模块、系统的一个组成部分或者一个完整的系统。子系统通常是一些业务类,实现了一些具体的、独立的业务功能,其典型代码如下:
public class SubSystemA{
public void methodA(){
//具体实现代码
}
}
public class SubSystemB{
public void methodB(){
//具体实现代码
}
}
public class SubSystemC{
public void methodC(){
//具体实现代码
}
}
在引入外观类只,与子系统业务类之间的交互统一由外观类来完成,在外观类中通常存在如下代码:
public class Facade{
private SubSystemA obj1=new SubSystemA();
private SubSystemB obj2=new SubSystemB();
private SubSystemC obj3=new SubSystemC();
public void mothod(){
obj1.methodA();
obj2.methodB();
obj3.methodC();
}
}
由于在外观类中维持了对子系统对象的引用,客户端可以通过外观类来间接调用子系统对象的业务方法,而无需与子系统对象进行直接交互。在引入外观类之后,客户端代码变得非常简单,典型代码如下:
public class Client{
public static void main(String args[]){
Facade facade = new Facade();
facade.method();
}
}
总之,外观模式,就是不让客户端知道子系统复杂的实现逻辑,减少客户类的所需处理对象的数目,并是子系统使用起来更加容易,让客户类和子系统实现松耦合的关系。
本文借鉴了刘伟老师的《Java设计模式》一书以及老师的相关博客