门面模式提供一个高层次的接口,使得子系统更容易使用。

  子系统与外部系统的通信必须经过一个统一的facade进行处理。

  内部系统的交互在facade中进行整合,这样,对于外部系统的使用者就不用关注内部系统的复杂性。而有facade的存在也降低了内外系统的耦合。

1.内部系统

  1.1 内部子系统1--对茶的操作

package designPattern.facade;

public class TeaDeal {
public void getTea() {
System.out.println("放茶....");
} public void cookTea() {
System.out.println("煮茶....");
}
}

  1.2 内部子系统2--对水的操作

package designPattern.facade;

public class WaterDeal {
public void poulWater() {
System.out.println("倒水....");
} public void boilWater() {
System.out.println("烧水....");
}
}

2.外部调用

这里面我们将泡茶的流程设定为:放茶→烧水→泡茶,不采用facade模式的时候,我们会这样做

package designPattern.facade;

public class NoFacadeTest {
public static void main(String[] args) {
TeaDeal teaDeal = new TeaDeal();
WaterDeal waterDeal = new WaterDeal();
//泡茶
teaDeal.getTea();
waterDeal.boilWater();
waterDeal.poulWater();
}
}

  有了facade,我们会这样做

  2.1 创建facade

package designPattern.facade;

public class Facade {
private TeaDeal teaDeal;
private WaterDeal waterDeal; public Facade() {
this.teaDeal = new TeaDeal();
this.waterDeal = new WaterDeal();
} public void cookTea(){
System.out.println("这是泡茶流程....");
teaDeal.getTea();
waterDeal.boilWater();
waterDeal.poulWater();
} public void boilTea(){
System.out.println("这是煮茶流程...");
teaDeal.getTea();
waterDeal.poulWater();
teaDeal.cookTea();
}
}

  2.2 外部调用

package designPattern.facade;

public class FacadeTest {
public static void main(String[] args) {
Facade facade = new Facade();
facade.boilTea();
facade.cookTea();
}
}

3.对比分析

  在追MM和设计模式这篇神文中,对与facade的形象解释:

  我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相机有Facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样MM也可以用这个相机给我拍张照片了。

  与上面的示例相对应的,facade提供的方法中也有自动档这个档位(泡茶),MM不用去关注怎么去烧水怎么去倒水,泡茶成了一键式,大大的方便了MM呀。

也谈设计模式Facade的更多相关文章

  1. [转] 设计模式 -- Facade

    PS:Façade模式注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能. Facade模式 Faca ...

  2. 外观设计模式 (Facade)

    目的:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使 外观设计模式使用场合: 1. 在设计初期阶段,应该有意识的将不同的两个分层.层与层之间建立外观 ...

  3. 以css为例谈设计模式

    什么是设计模式? 曾有人调侃,设计模式是工程师用于跟别人显摆的,显得高大上:也曾有人这么说,不是设计模式没用,是你还没有到能懂它,会用它的时候. 先来看一下比较官方的解释:"设计模式(Des ...

  4. 设计模式-Facade(结构型模式) 针对 最终类的实现通过一系列类的相关操作,重点关注 起始与结尾的操作。

    以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Facade.h #pragma once class Subsystem1 { public: Subsystem1() ...

  5. 浅谈设计模式-visitor访问者模式

    先看一个和visitor无关的案例.假设你现在有一个书架,这个书架有两种操作,1添加书籍2阅读每一本书籍的简介. //书架public class Bookcase { List<Book> ...

  6. C++设计模式-Facade模式

    Facade模式 作用:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 动机 将一个系统划分成为若干个子系统有利于降低系统的复杂性.一 ...

  7. iOS 趣谈设计模式——通知

    [前言介绍] iOS的一种设计模式,观察者Observer模式(也叫发布/订阅,即Publich/Subscribe模式). 观察者模式,包含了通知机制(notification)和KVO(Key-v ...

  8. 浅谈设计模式--装饰者模式(Decorator Pattern)

    挖了设计模式这个坑,得继续填上.继续设计模式之路.这次讨论的模式,是 装饰者模式(Decorator Pattern) 装饰者模式,有时也叫包装者(Wrapper),主要用于静态或动态地为一个特定的对 ...

  9. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

随机推荐

  1. Python---copy()、deepcopy()与赋值的区别

    copy()与deepcopy()之间的主要区别是python对数据的存储方式. 首先直接上结论: —–深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在.所以改变原有被复制对象不会对已经复 ...

  2. Nginx + uwsgi 时,替换路径。

    { # Django api use uwsgi location /api/ { # /api/hello ==> /hello rewrite ^/api/(.*) /$1 break; # ...

  3. use-svn-cmd(Linux)

    SVN是Subversion的简称,是一个开放源代码的版本控制系统,它采用了分支管理系统,是一个跨平台的软件,支持大多数常见的操作系统. svn命令行使用: 1.查看svn所支持的全部命令 $ svn ...

  4. 昂贵的聘礼 - poj 1062 (Dijkstra+枚举)

      Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39976   Accepted: 11596 Description 年 ...

  5. RecyclerView 踩坑

    一.RecyclerView设置拖动后怎么监听拖动的开始和结束 ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.Cal ...

  6. vue prop不同数据类型(数组,对象..)设置默认值

    vue prop 会接收不同的数据类型,这里列出了 常用的数据类型的设置默认值的写法,其中包含: Number, String, Boolean, Array,  Function, Object   ...

  7. Javascript获取各种浏览器可见窗口大小

    function getInfo() { var s = ""; s += " 网页可见区域宽:"+ document.body.clientWidth; s ...

  8. 关于iphone自动播放音频和视频问题的解决办法

    大家都知道 做移动端 会遇到音频和视频无法自动播放问题(我也遇到了)于是想办法解决这个问题 我只是找到了在微信中解决的办法(如果谁有在别的浏览器有这个办法  请私聊我 )我是没有发现 document ...

  9. iOS 7 修改默认布局从status bar 底部开始

    最近在对公司的一个老项目进行版本升级,添加了导航栏和tabBar,并且在个人中心界面隐藏navigationBar,于是在控制器里添加了如下对象方法: - (void)viewWillAppear:( ...

  10. Android自定义属性format类型

    1. reference:参考某一资源ID. (1)属性定义: <declare-styleable name = "名称"> <attr name = &quo ...