门面模式思想
门面模式(又称为外观模式)是一种结构型设计模式。
思想: 为子系统的各个模块提供一个统一的门面,由门面负责对客户提供服务。
当一次的功能访问同时调用到多个对象时,可以使用外观模式。例如,在分布式应用中,通过远程调用服务,使用外观模式可以降低应用程序与服务的交互次数,同时可以降低应用程序的复杂性。
门面模式涉及2个角色
- 门面(Facade):负责为客户提供服务,将所有从客户端发来的请求委派到相应的子系统去。
- 子系统(Subsystem):子系统中包含多个模块。可包含一个或多个子系统。每个子系统都可以被客户端直接调用,或者被门面角色调用,子系统并不知道门面的存在。
案例前言
给女朋友写情书,写信的过程:
- 1、先写信的内容。
- 2、然后写信封上的地址。
- 3、然后把信放到信封中封好。
- 4、投递到信箱中进行邮递。
比如到了情人节,要给很多个女朋友写信,每个步骤都要自己做,那不要累死。还好,现在邮局开发了一个新业务,你只要把信件的必要信息告诉我,我给你发,我来做这四个过程,你就不要管了,只要把信件交给我就成了。

案例代码实现

写信接口,抽象出写信需要的方法:
public interface LetterProcess {
//首先要写信的内容
void writeContext(String context);
//其次写信封
void fillEnvelope(String address);
//把信放到信封里
void letterInotoEnvelope();
//然后邮递
void sendLetter();
}
实现写信的方法:
public class LetterProcessImpl implements LetterProcess {
//写信
public void writeContext(String context) {
System.out.println("填写信的内容...." + context);
}
//在信封上填写必要的信息
public void fillEnvelope(String address) {
System.out.println("填写收件人地址及姓名...." + address);
}
//把信放到信封中,并封好
public void letterInotoEnvelope() {
System.out.println("把信放到信封中....");
}
//塞到邮箱中,邮递
public void sendLetter() {
System.out.println("邮递信件...");
}
}
定义门面,封装了写信过程的步骤,并对外提供一个方法:
public class ModenPostOffice {
private LetterProcess letterProcess = new LetterProcessImpl();
//写信,封装,投递,一体化了
public void sendLetter(String context, String address) {
//帮你写信
letterProcess.writeContext(context);
//写好信封
letterProcess.fillEnvelope(address);
//把信放到信封中
letterProcess.letterInotoEnvelope();
//邮递信件
letterProcess.sendLetter();
}
}
客户只要把信的内容以及收信地址给邮局,邮局就会把信写好,封好,并发送出去:
public class Client {
public static void main(String[] args) {
//现代化的邮局,有这项服务,邮局名称叫Hell Road
ModenPostOffice hellRoadPostOffice = new ModenPostOffice();
//你只要把信的内容和收信人地址给他,他会帮你完成一系列的工作;
String address = "Happy Road No. 666,God Province,Heaven"; //定义一个地址
String context = "Hello,It's me,do you know who I am? I'm your old lover. I'd like to....";
hellRoadPostOffice.sendLetter(context, address);
}
}
运行结果:

上面使用了门面模式后,系统的扩展性也有了很大的提高,突然一个非常时期,国家需要对邮局寄出去的所有进行检查,只需要在邮局寄出去的时候进行检查,这个变更对于客户来说是透明的,他也不用了解,一切邮局已经帮做了。
修改邮局类,增加警察,警察在发送信件之前对信件进行检查:
public class ModenPostOffice {
private LetterProcess letterProcess = new LetterProcessImpl();
private Police letterPolice = new Police();
//写信,封装,投递,一体化了
public void sendLetter(String context, String address) {
//帮你写信
letterProcess.writeContext(context);
//写好信封
letterProcess.fillEnvelope(address);
//警察要检查信件了
letterPolice.checkLetter(letterProcess);
//把信放到信封中
letterProcess.letterInotoEnvelope();
//邮递信件
letterProcess.sendLetter();
}
}
总结
门面模式是一个很好的封装方法,一个子系统比较复杂的实现,比如算法或者业务比较复杂,就可以封装出一个或多个门面出来,项目的结构简单,而且扩展性非常好。还有,在一个较大项目中的时候,为了避免人员带来的风险,也可以使用这个模式,技术水平比较差的成员,尽量安排独立的模块(Sub System),然后把他写的程序封装到一个门面里,尽量让其他项目成员不用看到这些不好的代码,看也看不懂。
当想选择性地暴露子系统模块的方法时,可以使用外观模式。
代码实现如下:
子系统:
public class ModuleA {
public void method1(){
System.out.println("Module A 1");
}
public void method2(){ // 不想暴露这个方法给客户
System.out.println("Module A 2");
}
}
public class ModuleB {
public void method1(){
System.out.println("Module B 1");
}
public void method2(){ // 不想暴露这个方法给客户
System.out.println("Module B 2");
}
}
门面:
public class Facade {
private ModuleA a = new ModuleA();
private ModuleB b = new ModuleB();
public void methodA() { a.method1(); }
public void methodB() { b.method1(); }
}
客户:
public class Client2 {
private Facade facade = new Facade();
public void method() {
facade.methodA();
facade.methodB();
}
public static void main(String[] args) {
Client2 client2 = new Client2();
client2.method();
}
}
运行结果:

优点
- 门面模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。
- 门面模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。
- 通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。
本文深入探讨了门面模式的设计理念,介绍了如何通过门面模式简化子系统操作,提高代码的可读性和可维护性。文章通过一个写信的案例,详细展示了门面模式的代码实现过程,以及如何通过门面模式增强系统的扩展性。
798

被折叠的 条评论
为什么被折叠?



