设计模式之(五)----门面模式【Facade Pattern】

大家都都写过纸质的信件吧,比如给女朋友写情书什么的,写信

的过程大家都还记得吧,先写信的内容,然后写信封,然后把信放到信封中,封好,投递到信箱中进行邮

递,这个过程还是比较简单的,虽然简单,这四个步骤都是要跑的呀,信多了还是麻烦,比如到了情人节,

为了大海捞针,给十个女孩子发情书,都要这样跑一遍,你不要累死,更别说你要发个广告信啥的,一下

子发 1 千万封邮件,那不就完蛋了?那怎么办呢?还好,现在邮局开发了一个新业务,你只要把信件的必

要信息高速我,我给你发,我来做这四个过程,你就不要管了,只要把信件交给我就成了。

现在我们先从原始状态开始:

在这中环境下,最累的是写信的人,为了发送一封信出去要有四个步骤,而且这四个步骤还不能颠倒,

你不可能没写信就把信放到信封吧,写信的人要知道这四个步骤,而且还要知道这四个步骤的顺序,恐怖

吧,我们先看看这个过程如何表现出来的:

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

package com.fc.facadePattern;

public interface LetterProcess {
    //首先要写信的内容
    public void writeContext(String context);
    //其次写信封
    public void fillEnvelope(String address);
    //把信放到信封里
    public void letterInotoEnvelope();
    //然后邮递
    public void sendLetter();
}

写信的具体实现:

package com.fc.facadePattern;

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(" 邮递信件...");
     }
}

然后就有人开始使用这个过程写信了:

package com.fc.facadePattern;

public class Client {

    public static void main(String[] args) {

         //创建一个处理信件的过程
         LetterProcess letterProcess = new LetterProcessImpl();
         //开始写信
         letterProcess.writeContext("Hello,It‘s me,do you know who I am? I‘m your old lover. I‘d like to....");

         //开始写信封
         letterProcess.fillEnvelope("Happy Road No. 666,God Province,Heaven");
         //把信放到信封里,并封装好
         letterProcess.letterInotoEnvelope();
         //跑到邮局把信塞到邮箱,投递
         letterProcess.sendLetter();

    }

}

那这个过程与高内聚的要求相差甚远,你想,你要知道这四个步骤,而且还要知道这四个步骤的顺序,

一旦出错,信就不可能邮寄出去,那我们如何来改进呢?先看类图:

我们来看程序的改变,LetterProcess 接口和实现类都没有改变,只是增加了一个

ModenPostOffice 类,我们这个 java 程序清单如下:

package com.fc.facadePattern;

public class ModePostOffice {

    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(地狱路邮局)提供了一种新型的

服务,客户只要把信的内容以及收信地址给他们,他们就会把信写好,封好,并发送出去,这种服务提出

时大受欢迎呀,这简单呀,客户减少了很多工作,那我们看看客户是怎么调用的,Client.java 的程序清单

如下:

package com.fc.facadePattern;

public class Client {

    public static void main(String[] args) {

        // 现代化的邮局,有这项服务,邮局名称叫Hell Road
        ModePostOffice hellRoadPostOffice = new ModePostOffice();
        // 你只要把信的内容和收信人地址给他,他会帮你完成一系列的工作;
        String address = "Happy Road No. 666,God Province,Heaven"; // 定义一个地址
        String context = "Hello,It‘s me,do you know who I am? ";

        hellRoadPostOffice.sendLetter(context, address);
    }

}

看到没,客户简单了很多,提供这种模式后,系统的扩展性也有了很大的提高,突然一个非常时期,

寄往 God Province(上帝省)的邮件都必须进行安全检查,那我们这个就很好处理了,看类图:

看这个红色的框,只增加了这一部分,其他部分在类图上都不需要改动,那我们来看源码:

package com.fc.facadePattern;

public class ModePostOffice {

    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();
    }
}

只是增加了一个 letterPolice 变量的声明以及一个方法的调用,那这个写信的过程就变成了这样:先

写信,然后写信封,然后警察开始检查,然后才把信放到信封,然后发送出去,那这个变更对客户来说,

是透明的,他根本就看不到有人在检查他的邮件,他也不用了解,反正现代化的邮件都帮他做了,这也是

他乐意的地方。

门面模式讲解完毕,这是一个很好的封装方法,一个子系统比较复杂的实话,比如算法或者业务比较

复杂,就可以封装出一个或多个门面出来,项目的结构简单,而且扩展性非常好。

时间: 2024-11-25 19:27:16

设计模式之(五)----门面模式【Facade Pattern】的相关文章

设计模式之门面模式---Facade Pattern

模式的定义 门面模式(Facade Pattern)也叫做外观模式,定义如下: Provide a unified interface to a set of interfaces in a subsystem. Facade defines a highet-level interface that makes the subsystem easier to use. 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行.门面模式提供一个高层次的接口,使得子系统更易于使用. 类型 结构

门面模式-Facade Pattern(Java实现)

门面模式-Facade Pattern 为一个复杂的模块或子系统提供一个简单的供外界访问的接口 本文中代码的例子如下: 一个矿场有很多矿工, 矿工的职责也都不一样. 但一样的是什么呢? 一样的就是每个矿工每天都在重复一样的事情....起床, 上班, 工作, 下班, 睡觉...... 要想管理这么多矿工的这么多事情可不简单(好麻烦啊...挨个调用的时候开发者也有可能会忘掉某个人, 或者忘掉某一个方法)., 再举个栗子, 比如操作数据库也一样, 要加载驱动, 建立连接, 操作数据库, 关闭连接. 这

大熊君说说JS与设计模式之(门面模式Facade)迪米特法则的救赎篇------(监狱的故事)

一,总体概要 1,笔者浅谈 说起“门面”这个设计模式其实不论新老程序猿都是在无意中就已经运用到此模式了,就像我们美丽的JS程序员一样不经意就使用了闭包处理问题, 1 function Employee(name) { 2 var name = name; 3 this.say = function () { 4 console.log("I am employee " + name) ; 5 } ; 6 } 代码中“say”是一个function,Employee也是一个functio

php门面模式(facade pattern)

书上不全的代码,我自己补全的. <?php /* The facade pattern is used when we want to simplify the complexities of large systems through a simpler interface. It does so by providing convenient methods for most common tasks, through a single wrapper class used by a cli

设计模式 - 外观模式(facade pattern) 详解

外观模式(facade pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 外观模式(facade pattern): 提供了一个统一的接口, 用来访问子系统中的一群接口. 外观定义了一个高层接口, 让子系统更容易使用. 外观模式包含三个部分: 1. 子系统: 子类, 单个复杂子类 或 多个子类; 2. 外观(facade)类: 把子系统设计的更加容易使用; 3. 客户: 只需要调用外观类. 与适配器模式(adapter pattern)的

外观模式 门面模式 Facade 创建型 设计模式(十三)

外观模式(FACADE) 又称为门面模式 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口,这一接口使得这一子系统更加易于使用. 意图解析 随着项目的持续发展,系统基本上都是会往功能更全面的方向发展,那么也就意味着我们的系统将会变得更加复杂. 系统会被划分为多个单独的子系统,每个子系统完成一部分功能,通过分工协作完成全部功能. 一个子系统也可能进一步拆分为更小的几个子系统. 程序中的文件将会越来越多,相互关联也会变得更加复杂 当使用一个功能的时候,作为客户端 你需

设计模式-10外观模式(Facade Pattern)

1.模式动机 在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了. 软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂.这时如果系统内部发生改变,客户端也要跟着改变,这违背了"开闭原则",也违背了"迪米特法则(最少知道原则)",所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标. 2.模式定义 外观模式(F

二十四种设计模式:外观模式(Facade Pattern)

外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 示例有一个Message实体类,某对象对它的操作有Get()方法,另外还有一个对象有一个Validate()方法来判断用户是否有权限.现在提供一个高层接口来封装这两个方法. MessageModel using System; using System.Collections.Generic; using System.Text; nam

说说设计模式~门面模式(Facade)

返回目录 门面模式(Facade)属于结构型模式的一种,它符合面向对象的封装原则,但又不符合开闭原则,呵呵,今天我们主要说它的优点,不谈缺点. 定义 门面模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口.使用子系统更容易使用. 技巧 我们在设计子类时,由于外部通过门面去访问它的功能,所以一般子类都会被声明为internal. 何时能用到它? 1.客户只需要使用某个复杂系统的子集,或者需要以一种特殊的方式与系统交互时,使用门面模式. 2.当

设计模式(结构型)之外观模式(Facade Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之装饰者模式(Decorator Pattern)>http://blog.csdn.net/yanbober/article/details/45395747 概述 一个客户类需要和多个业务类交互,而这些业务类经常会作为整体出现,由于涉及到的类比较多,导致使