设计模式-门面模式

门面模式的例子:写信。写信的过程,先写信的内容,然后写信封,再然后把信放到信封中,封好送邮局。
这个过程还是比较简单的,但是虽然简单,万一你要给十个百个千个人写呢,麻烦咯。还好,现在邮局开发了一个新的业务,你只要把信件的必要信息告诉我,我给你发,我来做这四个过程,你就不要管了,只要把信给我就行了。
我们的类图还是从最原始的状态开始:
这里写图片描述

先看写信的过程接口,定义了写信的四个步骤:

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下载地址
设计模式之门面模式

猜你喜欢

转载自blog.csdn.net/qq_20967339/article/details/80466101