Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。

  外观模式的角色和职责  

  1、Facade:为调用方定义简单的调用接口。  

  2、Clients:调用者。通过Facade接口调用提供某功能的内部类群。  

  3、Packages:功能提供者。指提供功能的类群(模块或子系统)。

  使用场景

  在以下情况下可以考虑使用外观模式:
  (1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。
  (2) 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。
  (3) 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。
 
  简单来说,使用了外观模式,用户就不必直接面对众多功能模块,降低了使用难度,简单举个例子
  电脑开机进入系统,我们把他分为4步,首先打开电源,bois自检,系统引导,进入系统,4个功能是四个功能模块
  打开电源
 public class StartPower {
/*
* 打开电源
*/
public void startPower(){
System.out.println("电脑通电");
}
}

  bois自检

 public class BoisSelfTest {
/*
* bios自检
*/
public void boisSelfTest(){
System.out.println("bios自检");
}
}

  系统引导

 public class SystemGuide {
/*
* 系统引导
*/
public void systemGuide(){
System.out.println("系统引导");
}
}

  进入系统

 public class EnterSystem {
/*
* 进入系统
*/
public void enterSystem(){
System.out.println("进入系统");
}
}

  如果,我们没有使用外观模式,就需要用户自己挨个使用这些功能

 public class MainClass {
public static void main(String[] args) {
StartPower startPower = new StartPower();
startPower.startPower(); BoisSelfTest boisSelfTest = new BoisSelfTest();
boisSelfTest.boisSelfTest(); SystemGuide systemGuide = new SystemGuide();
systemGuide.systemGuide(); EnterSystem enterSystem = new EnterSystem();
enterSystem.enterSystem();
}
}

  运行结果为:

  这样,电脑顺利启动,可是同样可以看出来,用户使用非常繁琐,不仅需要用户自己挨个使用所有用到的功能,同时还需要用户知道电脑启动的顺序,按顺序使用功能,不然就会导致问题,这样显然是不可取的

  所以,用到外观模式,创建一个Facade,专门用于使用功能模块

 public class Facade {
private StartPower startPower = null;
private BoisSelfTest boisSelfTest = null;
private SystemGuide systemGuide = null;
private EnterSystem enterSystem = null; public void startComputer(){
startPower = new StartPower();
boisSelfTest = new BoisSelfTest();
systemGuide = new SystemGuide();
enterSystem = new EnterSystem(); startPower.startPower();
boisSelfTest.boisSelfTest();
systemGuide.systemGuide();
enterSystem.enterSystem();
}
}

  这时客户端就是这样

 public class MainClass {
public static void main(String[] args) {
Facade computer = new Facade();
computer.startComputer();
}
}

  可以看到,用户这时只需要调用Facade中的方法即可,无需知道电脑有什么具体的功能模块,无需知道功能模块执行的顺序是什么,只是调用一下就好了。

  简化了使用,同时也增加了代码的复用与可维护性。

  优点

  1、松散耦合:使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护;

  2、简单易用:客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可。

  3、更好的划分访问层次:有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节。

 
 
 

java设计模式-----12、外观模式的更多相关文章

  1. 【JAVA设计模式】外观模式(Facade Pattern)

    一  定义 为子系统中的一组接口提供一个一致的界面.Facade模式定义了一个高层的接口,这个接口使得这一子系统更加easy使用. 二  案例 一个子系统中拥有3个模块.每一个模块中都有3个方法.当中 ...

  2. java设计模式之外观模式(门面模式)

    针对外观模式,在项目开发和实际运用中十分频繁,但是其极易理解,下面就简要介绍一下. 一.概念介绍 外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口.这种类型的设计 ...

  3. Java设计模式之五 ----- 外观模式和装饰器模式

    前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这 ...

  4. Java设计模式之外观模式和最少知识原则

    外观模式: 外观模式:提供一个统一的接口,来访问子系统中一群功能相关接口(类似一键启动,一键关闭等等) 外观模式定义了一个高层接口,让子系统更容易使用 降低对外接口耦合度 外观模式和命令模式各自侧重点 ...

  5. java设计模式之外观模式

    外观模式概念 外观模式又称为门面模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个搞层次接口,使得这一个子系统更加容易使用.这一模式完美的体现了依赖倒转原则和迪米特法则的思想,所以是非常常 ...

  6. 由一名保安引发的Java设计模式:外观模式

    目录 应用场景 外观模式 定义 意图 主要解决问题 何时使用 优缺点 结构 保安的故事 应用场景 使用方要完成一个功能,需要调用提供方的多个接口.方法,调用过程复杂时,我们可以再提供一个高层接口(新的 ...

  7. JAVA设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  8. 设计模式之 外观模式详解(Service第三者插足,让action与dao分手)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,LZ今天给各位分享一 ...

  9. java设计模式5--原型模式(Prototype)

    本文地址:http://www.cnblogs.com/archimedes/p/java-prototype-pattern.html,转载请注明源地址. 原型模式 用原型实例指定创建对象的种类,并 ...

  10. 每天一个设计模式-2 外观模式(Facade)

    每天一个设计模式-2  外观模式(Facade) 1.生活中的示例 客户想要购买一台电脑,一般有两种方法: 1.自己DIY,客户需要知道组成电脑的所有电子器件,并且需要熟悉那些配件,对客户要求较高. ...

随机推荐

  1. python bittorrent 使用与学习

    更新于20171128 关于这个p2p的技术,阿里开源了蜻蜓,大家可以看看,感觉应该比这个要好用,而且文档也全. 前言 最近在学习python的p2p协议,发现网上找不到好的文章,又仔细找了找终于找到 ...

  2. noip第16课资料

  3. ReSharper 10.0.0.2 Ultimate 破解

    文件下载地址:http://pan.baidu.com/s/1gf7l8cF 1.安装ReSharper 10.0.0.2 Ultimate 2.修改Products.json文件的FilePath, ...

  4. Coding能力提升小技巧

    一.使用变量的一般原则 1.变量初始化原则: 通常在变量声明时初始化; 在靠近变量第一次使用的位置初始化; 在类的构造函数里初始化变量. 2.作用域: 使变量引用局部化,即把引用到变量的地方尽可能集中 ...

  5. Dynamic Programming | Set 4 (Longest Common Subsequence)

    首先来看什么是最长公共子序列:给定两个序列,找到两个序列中均存在的最长公共子序列的长度.子序列需要以相关的顺序呈现,但不必连续.例如,"abc", "abg", ...

  6. 关于Runtime.getRuntime().exec()产生阻塞的2个陷阱

    本文来自网易云社区 背景 相信做java服务端开发的童鞋,经常会遇到Java应用调用外部命令启动一些新进程来执行一些操作的场景,这时候就会使用到Runtime.getRuntime().exec(), ...

  7. IOS - 修改APP桌面名称为中文名称!

    1,修改“Display Name”为想要的中文. 2,修改“bundle display name”为想要的中文.

  8. Java 字符串类型常用方法

    常用方法 获取字符串长度 public int length() 字符串Unicode操作 这部分用的不多,不是很清楚,先记载在这. //获取指定索引处的元素对应的unciode编码 public i ...

  9. 第八节:详细讲解Java中的异常处理情况与I/O流的介绍以及类集合框架

    前言 大家好,给大家带来详细讲解Java中的异常处理情况与I/O流的介绍以及类集合框架的概述,希望你们喜欢 JAVA 异常 try...catch...finally结构的使用方法 class Tes ...

  10. python库函数Map, Filter and Reduce的用法

    python中有三个函数式编程极大的简化了程序的复杂性,这里就做一下讨论和记录. 一 Map:应用在链表输入所有元素的函数,它的格式如下所示: map(function_to_apply, list_ ...