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. Android-自定义TabHost

    效果图: 布局代码相关: <!-- 自定义简单的TabHost选项卡 --> <LinearLayout xmlns:android="http://schemas.and ...

  2. Linux(一) - Unix&Linux 历史

    Unix Unix 的诞生 Unix的历史可以追溯到20世纪60年代中期,当时麻省理工学院,AT&T,贝尔实验室和通用电气公司联合开发了一种名为Multics的操作系统,Multics 中存在 ...

  3. c#中sealed修饰符

    sealed 修饰符表示密封 用法: 1.用于类时,表示该类不能再被继承,不能和abstract同时使用,因为这两个修饰符在含义上互相排斥 2.用于方法和属性时,表示该方法或属性不能再被重写,必须和o ...

  4. 虚拟化 - VMware

    和VirtualBox一样,也需要关掉Hyper-V才能启动虚拟机,否则会报Guard的错误. 网络 [转]VMware网络连接模式-桥接.NAT以及仅主机模式的详细介绍和区别 桥接 就好像在局域网中 ...

  5. JS判断时特殊值与boolean类型的转换

    扒开JQuery以及其他一些JS框架源码,常常能看到下面这样的判断,写惯了C#高级语言语法的我,一直以来没能系统的理解透这段代码. var test; //do something... if(tes ...

  6. html开发基础

    1 Doctype Doctype告诉浏览器使用什么样的html或xhtml规范来解析html文档 有和无的区别 BackCompat:标准兼容模式未开启(或叫怪异模式[Quirks mode].混杂 ...

  7. django系列8.3.2--django中间件实现登录验证(2) 个人构想逻辑

    middleware.py from django.utils.deprecation import MiddlewareMixin from django.shortcuts import rend ...

  8. 【vue】——使用watch 观察路由变化,重新获取内容

    更新:11-29 时隔半年,又重新使用VUE进行开发,有了新方案--beforeRouteLeave 在组件内直接使用,前提是你用了vue-router: beforeRouteLeave (to, ...

  9. multiprocessor(中)

    一.进程同步(锁) 通过之前的学习,我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,他们之间的运行没有顺序,一旦开启也不受我们控制.尽管并发编程让我们能更加充分的利用IO资源,但 ...

  10. day 10 课后作业

    # -*- coding: utf-8 -*-# @Time : 2019/1/2 16:35# @Author : Endless-cloud# @Site : # @File : 课后作业.py# ...