门面模式的例子:写信。写信的过程,先写信的内容,然后写信封,再然后把信放到信封中,封好送邮局。
这个过程还是比较简单的,但是虽然简单,万一你要给十个百个千个人写呢,麻烦咯。还好,现在邮局开发了一个新的业务,你只要把信件的必要信息告诉我,我给你发,我来做这四个过程,你就不要管了,只要把信给我就行了。
我们的类图还是从最原始的状态开始:
先看写信的过程接口,定义了写信的四个步骤:
package com.example.xpeng.menmian;
/**
* Created by xpeng on 2018/5/26.
* 定义一个写信的过程
*/
public interface LetterProcess {
//首先要写信的内容
public void writeContext(String context);
//其次是写信
public void fillEnvelope(String address);
//把信放到信封里
public void letterInotoEnvelope();
//然后邮递
public void sendLetter();
}
写信过程的具体实现:
package com.example.xpeng.menmian;
import android.util.Log;
/**
* Created by xpeng on 2018/5/26.
* 写信的具体实现了
*/
public class LetterProcessImpl implements LetterProcess {
@Override
public void writeContext(String context) {
Log.e("xyz", " 填写信的内容... "+context);
}
@Override
public void fillEnvelope(String address) {
Log.e("xyz","填写收件人地址及姓名..."+address);
}
@Override
public void letterInotoEnvelope() {
Log.e("xyz","把信放到信封中...");
}
@Override
public void sendLetter() {
Log.e("xyz","邮递信件...");
}
}
然后有人开始用这个过程写信了。
//创建一个处理信件的过程
LetterProcess letterProcess = new LetterProcessImpl();
//开始写信
letterProcess.writeContext("hello,is me first student..");
//开始写信封
letterProcess.fillEnvelope("Happy Road No.666");
//把信放到信封里,并封装好
letterProcess.letterInotoEnvelope();
//跑到邮局投递
letterProcess.sendLetter();
那这个过程与高内聚的要求相差甚远,你想,你要是知道这四个步骤,而且还要知道这四个步骤的顺序,一段出错,信就不可能寄出去了,那我们如何来改进呢?先看类图:
这就是门面模式,还是比较简单的,Sub System比较复杂,为了让调用者更方便的调用,就对Sub System进行封装,增加一个门面,Client调用时,直接调用门面的方法就可以了,不用了解具体的实现方法以及相关业务顺序,我们来砍程序的改变,LetterProcess接口和实现类都没有改变,只是增加了一个ModenPostOffice类,我们的java程序如下:
package com.example.xpeng.menmian;
/**
* Created by xpeng on 2018/5/26.
*/
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();
}
}
这个类什么意思呢,就是说现在有一个叫Hell Road PostOffice(牛逼的邮局)提供了一个新型的服务,客户只要把信的内容以及收信地址给他们,他们就会把信写好,封号,并发送出去。
//现代化的邮局,有这项服务,邮局名称Hell Road
ModenPostOffice hellRoadPostOffice = new ModenPostOffice();
//你只要把信的内容和收信人地址给他,他会帮你完成一些列的工作
String address = "Happ Road NO.666";
String context = "Hello ,.....";
hellRoadPostOffice.sendLetter(context,address);
package com.example.xpeng.menmian;
/**
* Created by xpeng on 2018/5/26.
*/
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();
}
}
/**
* Created by xpeng on 2018/5/26.
*/
class Police {
public void checkLetter(LetterProcess letterProcess ) {
Log.e("xyz","检查信件");
}
}
只是增加了一个letterPolice变量的声明以及一个方法的调用,那这个写信的过程就变成了这样:
先写信,然后封信,然后警察检查,然后才把信放到信封,最后发送出去。这个变更对客户来说,看不见,也不用了解,反正现代化邮件都帮他做了。
门面模式讲解完毕,这是一个很好的封装方法,一个子系统比较复杂的话,比如算法或者业务比较复杂,就可以封装出一个或多个门面出来,项目结构简单,而且扩展性非常好。
DEMO下载地址
设计模式之门面模式