1.外观模式(Facade [fə'sɑd] n. 正面;表面;外观)

外观模式:可以理解为 中介模式(没错,就是在用户与系统之间,增加了一个类,而这个类就是外观类,所以这个模式就叫外观模式)

如下图:

在如下图:

2.代码实现,我们就以第二个图为例子

2.1.首先创建三个子系统类

创建Cpu类:

 package design.pattern.facade;

 public class Cpu {
public void turnOn() {
System.out.println("启动CPU");
} public void shutdown() {
System.out.println("关闭CPU");
}
}

同理创建Memery类:

 package design.pattern.facade;

 public class Memery {
public void turnOn() {
System.out.println("加载内存");
} public void shutdown() {
System.out.println("释放内存");
}
}

最后创建Disk类:

 package design.pattern.facade;

 public class Disk {
public void turnOn(){
System.out.println("加载硬盘");
} public void shutdown(){
System.out.println("关闭硬盘");
}
}

2.2. 创建外观类,或者叫 中介类 Computer,为了能够使用多态,这里先创建一个Computer的抽象类

 package design.pattern.facade;

 /*
* Computer就是外观接口类,
* 这里是要使用接口或者抽象类的了,到时用户调用的都是这种类型的,
* 这样就算我们修改了内部,对用户的操作都没有影响
* **/
public abstract class Computer {
public abstract void turnOn();
public abstract void shutdown();
}

在创建一个DellComputer继承了Computer类:

 package design.pattern.facade;

 public class DellComputer extends Computer{
//这个是关键,这里声明为private是防止用户直接去调用这些子系统
//保证了用户只能通过外观类来进行访问 //同时这里也是缺点,当新增子系统是必须手动修改DellComputer
private Cpu cpu;
private Memery mem;
private Disk disk; //这个构造方法也很有意思,若没有参数,则自行创建新的子系统,CPU,内存,Disk这些都可以看作子系统
public DellComputer(){
this.cpu = new Cpu();
this.mem = new Memery();
this.disk = new Disk();
} public DellComputer(Cpu cpu,Memery mem,Disk disk){
this.cpu = cpu;
this.mem = mem;
this.disk = disk;
} //下面这两个方法都一样,都是统一调用了3个子系统的方法
@Override
public void turnOn() {
cpu.turnOn();
mem.turnOn();
disk.turnOn();
} @Override
public void shutdown() {
cpu.shutdown();
mem.shutdown();
disk.shutdown();
} }

2.3.最后,来使用一下,创建一个用户 Tommy类:

 package design.pattern.facade;

 public class Tommy {
public static void main(String[] args){
Computer com = new DellComputer();
com.turnOn();//开电脑,用户只需要按下开机按钮,CPU,内存,硬盘这些都会自动启动,而不需要用户操心
com.shutdown();//关机,同理,难道还得用户一个个的关么···
}
}

运行结果:

3.小总结:

3.1. 什么时候使用外观模式:

当用户仅关心调用的接口,而不关心内部运作时,可以尝试使用

3.2. 优点:

使用了中介类嘛,稍微解耦了一下,不过也正因为这个中介类,导致了它不可避免的硬伤

3.3. 缺点:

用户调用这边几乎没什么问题,关键是,当子系统类有变动时(新增、删除、或修改方法),中介类(外观类)必须做修改····

参考链接:http://www.cnblogs.com/dobetter/archive/2012/05/07/2488148.html 和 http://www.cnblogs.com/voidy/p/4234683.html

java外观模式(Facade)的更多相关文章

  1. 使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)

    本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲, 想插入到欧洲标准的墙壁插座里面, 就需要用中间这个电源适配器. 面向对象的适配器 你有 ...

  2. Web中的积累:外观模式 Facade

    摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 壹 前言 目测好久没写文章了,距离上一篇文章也有二十多天.我是怎么了?哈 ...

  3. 【转】设计模式(九)外观模式Facade(结构型)

    设计模式--外观模式Facade(结构型): 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...

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

    外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.示例有一个Message实体类,某对象对它 ...

  5. 设计模式-外观模式(Facade)

    简介 外观模式(Facade),将外部与内部子系统的通信通过一个统一的门面对象进行. 由两部分组成: 门面角色:供外部调用,内部可能组装了多个子系统,多个方法. 子系统角色:子系统的方法也可以直接供外 ...

  6. 设计模式(九)外观模式Facade(结构型)

    设计模式(九)外观模式Facade(结构型) 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...

  7. 乐在其中设计模式(C#) - 外观模式(Facade Pattern)

    原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...

  8. 设计模式(二)-- 外观模式(Facade)

    设计模式(二) 外观模式(Facade) 为了解决子系统外部的客户端在使用子系统的时候,既能简单地使用这些子系统内部的模块功能,而又不用客户端去与子系统内部的多个模块交互的问题. 为子系统中的一组接口 ...

  9. 外观模式facade

    一句话,多外呈现一个统一接口,内部的具体实现不关心. 外观模式facade,其实就是在调用者 与 被调用的实现层 之间加一层 facade层,不管内部如何实现, 用什么技术 方法实现,对外呈现的外观是 ...

随机推荐

  1. Oracle EBS FND User Info API

    1. 与用户信息相关API PKG. --和用户处理有关的API FND_USER_PKG;     --和用户密码处理有关的API FND_WEB_SEC;     --和用户职责处理有关的API ...

  2. 点滴笔记(二):利用JS对象把值传到后台

    记得以前刚写asp.net 从前台往后台传值 都是var data=A,B,C,D,E; 循环添加用逗号隔开 后台还要被测试测出只输入,就错了 哈哈..后来用✈◆类似的符号隔开 不是长久之计... 现 ...

  3. java写入换行符

    写入一个文件,生成文本文档,里面写入1000行字符,但是写出来的没有换行.所以纠结,百度了下,一行完事. String crlf=System.getProperty("line.separ ...

  4. web api 请求结果中页面显示的json字符串与json对象结果不一致

    我在前端调用这个api的时候也是百思不得其解,明明看到页面上的结果ID是不一样的,但是在js中使用的时候,却一直有重复ID的情况 后来才发现原来是long这个类型的原因,JavaScript中Numb ...

  5. java学习笔记—实现一个类MyInputStream(28)

    1 实现一个类MyInputStream读取文件,且不能抛出异常 public class TestDemo { public static void main(String[] args) thro ...

  6. BZOJ3210: 花神的浇花集会(坐标系变换)

    题面 传送门 题解 坐标系变换把切比雪夫距离转化为曼哈顿距离 那么对于所有的\(x\)坐标中,肯定是中位数最优了,\(y\)坐标同理 然而有可能这个新的点不合法,也就是说不存在\((x+y,x-y)\ ...

  7. linuxea:ELK5.5-elasticsearch-x-pack破解

    本站采用知识共享署名-非商业性使用-相同方式共享国际许可协议4.0 进行许可 本文作者:www.linuxea.com for Mark 文章链接:https://www.linuxea.com/17 ...

  8. Make ISO安装ArchLinux加Cinnamon

    Arch安装一直对大家对普通用户来說一直很难.国外大神为Arch安装进行了优化提供了更方便的安装方式 官网:http://www.evolutionlinux.com/ 以下爲个人理解,供大家参考. ...

  9. docker安装Tomcat软件,部署项目

    1 搜索tomcat镜像 $ sudo docker search tomcat NAME DESCRIPTION STARS OFFICIAL AUTOMATED tomcat Apache Tom ...

  10. P3622 [APIO2007]动物园

    题目链接 题意分析 这是一道状压\(DP\)的题 一个人只可以欣赏到\(5\)只动物 显然可以状压 我们用\(dp[i][j]\)表示当前\([i,i+4]\)中这\(5\)只动物的状态\(j\) 在 ...