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-自定义控件之绘图基础
画圆形,效果图: 布局中去指定自定义View: <view.custom.androidcustomviewbook.a_draw_base.BaseView android:layout_wi ...
- selenium 简单指南
1.1 下载selenium2.0的包 官方download包地址:http://code.google.com/p/selenium/downloads/list 官方User Guide: h ...
- nginx 内置参数
$args #这个变量等于请求行中的参数.$content_length #请求头中的Content-length字段.$content_type #请求头中的Content-Type字段.$docu ...
- Tempdb--查看tempdb使用的脚本
GO /****** Object: StoredProcedure [dbo].[usp_GetTempDBUsedSpace] Script Date: 03/05/2014 13:24:42 * ...
- PostgreSQL查询数据(基本查询)
原料:数据表 create table "SysUser"( "UserId" serial, --用户Id,自增 "UserName" ) ...
- 兼容性测试中如何切换和管理多个JDK版本
本文由作者邹珍珍授权网易云社区发布. 一.测试背景: 项目对外提供JAR包,需要测试该JAR包对不同JDK版本(1.6至1.9版本)的兼容性.下面主要介绍在兼容性测试中,JDK多版本共存时如何配置环境 ...
- Android TextView 嵌套图片及其点击,TextView 部分文字点击,文字多颜色
1. TextView 中嵌套图片的方法 TextView textView... textView.setText("..."); textView.append(Html.fr ...
- [CentOS] 7 不执行文件 /etc/rc.d/rc.local
chmod 0755 /etc/rc.local systemctl enable rc-local.service --now systemctl restart rc-local.service
- Android-获取手机已经安装的程序
有时候我们会查询手机里面是否安装了某个程序,或者获取已经安装软件名称的集合. android这边提供了相应的接口. [java] view plaincopy final PackageManager ...
- docker微服务部署之:二、搭建文章微服务项目
docker微服务部署之:一,搭建Eureka微服务项目 一.新增demo_article模块,并编写代码 右键demo_parent->new->Module->Maven,选择M ...