什么是外观模式,我想大家在网上一搜就有一大把结果,告诉你什么是外观模式,可能定义不完全一样,但是意思确差不多,也就是它为子系统中的一组接口提供了一个统一的界面(或者叫做接口),这样的好处就是隐藏了子系统的细节。下面就简单的谈谈我本人对该模式的使用和理解:
1、为什么要用这个东西:
比如一,当你在设计分层架构时,层与层之间需要分离,前端要对后台的方法进行调用,当你的系统足够的复杂的话,那么前台对后台的调用也会变得异常的复杂;比如二,你在设计的时候,子系统往往会因为不断的重构演化变得越来越复杂,然后这也给外部的调用增加了困难;比如三,在维护一个遗留的大系统时,可能随着时间的推移,系统也会变得越来越难以维护,但是它包含了非常重要的功能,新的需求依赖于它。
然而此时增加一个外观可以大大减少难度,说白了外观是用来解偶的。增加一个Facade,让前端对后台的调用不去直接调用后台的接口或方法,直接与Facede类进行交互即可,让那些调用这些不断变化的子系统的接口不去直接调用那些不断变化的子系统的接口,而调用一个简单的Facade,让那些新的需求也不再直接去调用难以维护的老系统,而是增加一个外观Facade,让新的系统直接与外观Facade类交互。这样大大的减少了他们之间的依赖。
2、怎么使用它:
Facade类,知道哪些子系统类负责处理请求,将客户的请求代理给适当的子系统对象。
比如,前端需要调用后台的一些方法,因此我们可以定义一个Facade接口,接口中有个invoke的抽象方法,其中ServerAction类指的是你所有对后台所进行的操作的信息:
定义一个Facade的接口:
public Object invoke(ServerAction action) throws Exception;
}
前端实现Facade接口
public class FacadeOfGui implements Facade {
private static final FacadeOfGui instance = new FacadeOfGui();
private FacadeOfGui() {
}
public static FacadeOfGui getInstance() {
return instance;
}
public Object invoke(ServerAction action) throws ServerActionException {
//在gui的这个方法中,对所要进行操作的信息进行包装,以及怎么传递到后台,然后获取到执行后所得到的结果,具体怎么和下一层进行通信这里不做详细说明;
}
public class FacadeOfServer implements Facade {
private static final FacadeOfGui instance = new FacadeOfGui();
private FacadeOfGui() {
}
public static FacadeOfGui getInstance() {
return instance;
}
public Object invoke(ServerAction action) throws ServerActionException {
//在Server的这个方法中,对前端传来的action进行解析,然后执行解析后的命令,再将执行后的结果进行返回,具体怎么和上一层进行通信这里不做详细说明;
}
3、总结:前台所有要对后台的操作,只要调用FacadeOfGui的invoke方法即可,不需要过多的关注后台的方法是否变动等等,前后台之间的耦合度大大降低。