java设计模式-----12、外观模式
Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。
外观模式的角色和职责
1、Facade:为调用方定义简单的调用接口。
2、Clients:调用者。通过Facade接口调用提供某功能的内部类群。
3、Packages:功能提供者。指提供功能的类群(模块或子系统)。
使用场景
- 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、外观模式的更多相关文章
- 【JAVA设计模式】外观模式(Facade Pattern)
一 定义 为子系统中的一组接口提供一个一致的界面.Facade模式定义了一个高层的接口,这个接口使得这一子系统更加easy使用. 二 案例 一个子系统中拥有3个模块.每一个模块中都有3个方法.当中 ...
- java设计模式之外观模式(门面模式)
针对外观模式,在项目开发和实际运用中十分频繁,但是其极易理解,下面就简要介绍一下. 一.概念介绍 外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口.这种类型的设计 ...
- Java设计模式之五 ----- 外观模式和装饰器模式
前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这 ...
- Java设计模式之外观模式和最少知识原则
外观模式: 外观模式:提供一个统一的接口,来访问子系统中一群功能相关接口(类似一键启动,一键关闭等等) 外观模式定义了一个高层接口,让子系统更容易使用 降低对外接口耦合度 外观模式和命令模式各自侧重点 ...
- java设计模式之外观模式
外观模式概念 外观模式又称为门面模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个搞层次接口,使得这一个子系统更加容易使用.这一模式完美的体现了依赖倒转原则和迪米特法则的思想,所以是非常常 ...
- 由一名保安引发的Java设计模式:外观模式
目录 应用场景 外观模式 定义 意图 主要解决问题 何时使用 优缺点 结构 保安的故事 应用场景 使用方要完成一个功能,需要调用提供方的多个接口.方法,调用过程复杂时,我们可以再提供一个高层接口(新的 ...
- JAVA设计模式--装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- 设计模式之 外观模式详解(Service第三者插足,让action与dao分手)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,LZ今天给各位分享一 ...
- java设计模式5--原型模式(Prototype)
本文地址:http://www.cnblogs.com/archimedes/p/java-prototype-pattern.html,转载请注明源地址. 原型模式 用原型实例指定创建对象的种类,并 ...
- 每天一个设计模式-2 外观模式(Facade)
每天一个设计模式-2 外观模式(Facade) 1.生活中的示例 客户想要购买一台电脑,一般有两种方法: 1.自己DIY,客户需要知道组成电脑的所有电子器件,并且需要熟悉那些配件,对客户要求较高. ...
随机推荐
- Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore
原文出处: 海子 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅 ...
- 初识Twisted(一)
pip install Twisted 安装Twisted库 from twisted.internet import reactor #开启事件循环 #不是简单的循环 #不会带来任何性能损失 rea ...
- MFC TabCtrl 控件修改标签尺寸
注意:无论那种方法,都要先设置Tab控件的Style属性为fixed width. 第一种方法 MFC,tabcontrol控件改变标签大小 - CSDN博客 https://blog.csdn.ne ...
- 基于DobboX的SOA服务集群搭建
本人第一次发博客,有什么不对的地方希望各位批评指正,我就不把文章copy过来了,直接上有道笔记的链接,希望各位喜欢. 第一部分: 准备工作 第二部分: dubbox的安装和使用 第三部分: RESTf ...
- 菜刀(代码执行)函数和命令执行函数详解及Getshell方法
i春秋作家:大家奥斯的哦 原文来自:https://bbs.ichunqiu.com/thread-41471-1-1.html 代码执行函数 VS 命令执行函数 一直想整理这两块的内容,但是一直没时 ...
- jQuery应用实例5:表单验证
1.validation插件的使用: 入门案例: <html> <head> <meta charset="UTF-8"> <title& ...
- bootstrap使用之多个弹窗和拖动效果[开发篇]
有时开发一些特效,自己感觉挺爽的,像操作自己电脑一样操作你的网页,这里就介绍一个使用bootstrap的一点多窗口和拖动效果吧! 这里,我们不使用静态打开的的方式,low...,1.添加一个a链接 触 ...
- Ideas
1.蔬菜店,自带种植的菜地.(实现蔬菜都是新采摘的.) 这个试用于农村,因为需要土地.农村现在蔬菜店大多也是外出进货.有些菜放久了,就坏掉了. 这里有问题就是,(1).如果销量不够,怎么让蔬菜不烂在菜 ...
- 注意:Tomcat Get请求的坑!
Tomcat8.5,当Get请求中包含了未经编码的中文字符时,会报以下错误,请求未到应用程序在Tomcat层就被拦截了. Tomcat报错: java.lang.IllegalArgumentExce ...
- JAVA中的COPYONWRITE容器
Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改, ...