java外观模式(Facade)
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)的更多相关文章
- 使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)
本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲, 想插入到欧洲标准的墙壁插座里面, 就需要用中间这个电源适配器. 面向对象的适配器 你有 ...
- Web中的积累:外观模式 Facade
摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 壹 前言 目测好久没写文章了,距离上一篇文章也有二十多天.我是怎么了?哈 ...
- 【转】设计模式(九)外观模式Facade(结构型)
设计模式--外观模式Facade(结构型): 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...
- 二十四种设计模式:外观模式(Facade Pattern)
外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.示例有一个Message实体类,某对象对它 ...
- 设计模式-外观模式(Facade)
简介 外观模式(Facade),将外部与内部子系统的通信通过一个统一的门面对象进行. 由两部分组成: 门面角色:供外部调用,内部可能组装了多个子系统,多个方法. 子系统角色:子系统的方法也可以直接供外 ...
- 设计模式(九)外观模式Facade(结构型)
设计模式(九)外观模式Facade(结构型) 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...
- 乐在其中设计模式(C#) - 外观模式(Facade Pattern)
原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...
- 设计模式(二)-- 外观模式(Facade)
设计模式(二) 外观模式(Facade) 为了解决子系统外部的客户端在使用子系统的时候,既能简单地使用这些子系统内部的模块功能,而又不用客户端去与子系统内部的多个模块交互的问题. 为子系统中的一组接口 ...
- 外观模式facade
一句话,多外呈现一个统一接口,内部的具体实现不关心. 外观模式facade,其实就是在调用者 与 被调用的实现层 之间加一层 facade层,不管内部如何实现, 用什么技术 方法实现,对外呈现的外观是 ...
随机推荐
- Android-自定义TabHost
效果图: 布局代码相关: <!-- 自定义简单的TabHost选项卡 --> <LinearLayout xmlns:android="http://schemas.and ...
- Linux(一) - Unix&Linux 历史
Unix Unix 的诞生 Unix的历史可以追溯到20世纪60年代中期,当时麻省理工学院,AT&T,贝尔实验室和通用电气公司联合开发了一种名为Multics的操作系统,Multics 中存在 ...
- c#中sealed修饰符
sealed 修饰符表示密封 用法: 1.用于类时,表示该类不能再被继承,不能和abstract同时使用,因为这两个修饰符在含义上互相排斥 2.用于方法和属性时,表示该方法或属性不能再被重写,必须和o ...
- 虚拟化 - VMware
和VirtualBox一样,也需要关掉Hyper-V才能启动虚拟机,否则会报Guard的错误. 网络 [转]VMware网络连接模式-桥接.NAT以及仅主机模式的详细介绍和区别 桥接 就好像在局域网中 ...
- JS判断时特殊值与boolean类型的转换
扒开JQuery以及其他一些JS框架源码,常常能看到下面这样的判断,写惯了C#高级语言语法的我,一直以来没能系统的理解透这段代码. var test; //do something... if(tes ...
- html开发基础
1 Doctype Doctype告诉浏览器使用什么样的html或xhtml规范来解析html文档 有和无的区别 BackCompat:标准兼容模式未开启(或叫怪异模式[Quirks mode].混杂 ...
- django系列8.3.2--django中间件实现登录验证(2) 个人构想逻辑
middleware.py from django.utils.deprecation import MiddlewareMixin from django.shortcuts import rend ...
- 【vue】——使用watch 观察路由变化,重新获取内容
更新:11-29 时隔半年,又重新使用VUE进行开发,有了新方案--beforeRouteLeave 在组件内直接使用,前提是你用了vue-router: beforeRouteLeave (to, ...
- multiprocessor(中)
一.进程同步(锁) 通过之前的学习,我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,他们之间的运行没有顺序,一旦开启也不受我们控制.尽管并发编程让我们能更加充分的利用IO资源,但 ...
- day 10 课后作业
# -*- coding: utf-8 -*-# @Time : 2019/1/2 16:35# @Author : Endless-cloud# @Site : # @File : 课后作业.py# ...