设计模式(九):外观模式

一、概述

  外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

二、解决问题

  在上一讲中,我们学习了适配器模式,它是用来转换一个接口的,而外观模式可以理解为转换一群接口,客户只要调用一个接口,而不用调用多个接口就可以达到目的。想想现实生活中例子,我们在pc上安装软件的时候经常有默认安装或者是一键安装选项(省去选择安装目录、安装的组件等等),还有就是手机的重启功能(把关机和启动合为一个操作)。总之,外观模式就是解决多个复杂接口带来的使用困难,起到简化用户操作的作用。

三、结构类图

四、成员角色

  客户(Client):直接调用外观接口就可以使用子系统了。

  外观(Facade):封装子系统的一个或者多个接口,并提供一个统一的接口给客户端调用。

五、应用实例

  最近几年一直比较流行智能家居,在我看来就是很多家电连了网,我们可以在手机上操作这些家电,给我们带来了很大的便利。下面我们假设这样一种场景,我们晚上回到家需要开灯、开空调、关窗、拉窗帘、放音乐,完成这五个动作我们才可以舒舒服服地躺在沙发上,缓解一天工作的辛劳。如果每天要进行这样的操作就太麻烦了,现在我们的智能家居来了,他给我们提供了一个手机app,只要将近到家的时候按下一个按钮,各种家电就会自动工作,营造一个舒适的家庭环境等着我们回来。来看看我们是怎么做到的。

  第一步、创建各种电器

package facade.pattern;
//电灯
public class Light {
	public void on(){
		System.out.println("电灯打开了");
	}

	public void off(){
		System.out.println("电灯关了");
	}
}

  

package facade.pattern;

//空调
public class Aircondition {
	public void on(){
		System.out.println("空调打开了");
	}

	public void off(){
		System.out.println("空调关了");
	}
}

  

package facade.pattern;

//窗
public class Window {
	public void on(){
		System.out.println("窗打开了");
	}

	public void off(){
		System.out.println("窗关了");
	}
}

  

package facade.pattern;

//窗帘
public class Curtain {
	public void on(){
		System.out.println("窗帘打开了");
	}

	public void off(){
		System.out.println("窗帘关了");
	}
}

  

package facade.pattern;

//mp3播放器
public class Mp3player {
	public void on(){
		System.out.println("mp3播放器打开了");
	}

	public void off(){
		System.out.println("mp3播放器关了");
	}
}

  第二步、创建手机app

package facade.pattern;

//手机app
public class App {
	private Light light;
	private Aircondition aircondition;
	private Window window;
	private Curtain curtain;
	private Mp3player mp3;

	//实例化时初始化电器
	public App(Light light, Aircondition aircondition, Window window,
			Curtain curtain, Mp3player mp3) {
		super();
		this.light = light;
		this.aircondition = aircondition;
		this.window = window;
		this.curtain = curtain;
		this.mp3 = mp3;
	}

	//设置在家模式,开启需要的家电
	public void atHome(){
		light.on();
		aircondition.on();
		window.off();
		curtain.off();
		mp3.on();
	}
}

  第三步、测试手机app

package facade.pattern;

public class AppTest {
	public static void main(String[] args){
		Light light = new Light();
		Aircondition aircondition = new Aircondition();
		Window window = new Window();
		Curtain curtain = new Curtain();
		Mp3player mp3 = new Mp3player();
		App app = new App(light,aircondition,window,curtain,mp3);
		//以上代码客户可以不用知道

		System.out.println("---用手机设置智能家居,设置为在家模式---");

		//客户一键操作设置在家模式
		app.atHome();
	}
}

运行结果:

    

六、优点和缺点

  1、优点

  (1)、外观不只是简化了接口,也将客户从组建的子系统中解耦。客户只需关注外观提供的接口,而不需要关心外观所封装的子系统的类。

  (2)、提供简化的接口的同时,依然将系统完整的功能暴露出来,以供需要的人使用。

七、使用场景

  1、当需要简化并统一一个很大的接口或者简化一群复杂的接口时使用外观。

  2、希望客户从一个复杂的子系统中解耦。

八、在外观模式中可以使用的设计原则--最少知识原则

  最少知识原则定义:只和你的密友交谈。

  最少知识原则设计方针是在就任何对象而言,在该对象的方法内,我们只应该调用属于以下范围的方法:

  1、该对象本身 

package facade.pattern;

public class LightTest {
	public void on(){
		System.out.println("电灯打开了");
	}

	public void off(){
		System.out.println("电灯关了");
	}

	public void test(){
		//在方法中调用本类中的其他方法
		on();
	}
}

  2、被当做方法的参数而传递进来的对象(外观模式手机app的例子)

//手机app
public class App {
        //外出模式
	public void goOut(Light light, Aircondition aircondition, Window window,
			Curtain curtain, Mp3player mp3){
		light.off();
		aircondition.off();
		window.on();
		curtain.on();
		mp3.off();
	}
}

  3、此方法所创建或实例化的任何对象

//手机app
public class App {
	private Light light;
	private Aircondition aircondition;
	private Window window;
	private Curtain curtain;
	private Mp3player mp3;
    
        public App(){

        }

	public Mp3player getMp3() {
		return mp3;
	}

	public void setMp3(Mp3player mp3) {
		this.mp3 = mp3;
	}

	public void startMp3(){
		mp3.on();
	}
} 

  //不建议如下使用

public void startMp3player(){
	Mp3player mp3 = new App().getMp3();
	mp3.on();
}

  应该改为

public void startMp3player(){
	new App().startMp3();
}

  4、对象的任何组件

//手机app
public class App {
	private Light light;
	private Aircondition aircondition;
	private Window window;
	private Curtain curtain;
	private Mp3player mp3;
    
        public App(){

        }

        //在该方法中,可以使用组件mp3的任何方法
	public void startMp3(){
		mp3.on();
	}
} 
时间: 2024-12-21 17:47:25

设计模式(九):外观模式的相关文章

设计模式之外观模式(九)

设计模式之外观模式 一.引言 当一个复杂的系统由多个复杂的子系统构成,然后客户端调用会调用多个子系统.这时,客户端会和多个子系统耦合在一起,当子系统需要扩展或者改变时,客户端也要随之改变,我们可以使用外观模式将客户端和子系统进行解耦. 二.介绍 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口. 何时使用: 1.客户端不需要知道系统内部的复杂联系,整个系统只需提供

【设计模式】外观模式

外观模式:它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用.这其实就是一个分层的思想,将较低层复杂的操作交由较高层同一管理,并向用户程序提供简单易用的接口.下面是一个用C++编写的外观模式的例子. #include <iostream> #include <string> using namespace std; // 键盘类 class Keyboard { public: string Type(const string &input) { retur

设计模式之外观模式(Facade)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

【设计模式】——外观模式

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式结构图: 代码模板: //四个子系统的类class SubSystemOne{public:    void MethodOne()    {        cout << "子系统方法一" << endl;    }};class SubSystemTwo{public:    void MethodTwo()    {  

C#设计模式(11)——外观模式(Facade Pattern)

一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 "门面"模式.下面就具体介绍下外观模式. 二.外观模式的详细介绍 2.1 定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内

Java设计模式菜鸟系列(九)外观模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39805735 外观模式(Facade):是为了解决类与类之间的依赖关系的,像spring一样,可以将类与类之间的关系配置到配置文件中,而外观模式就是将他们的 关系放在一个Facade类中,降低了类与类之间的耦合度,该模式中没有涉及到接口. 一.uml建模: 二.代码实现: /** * 示例:外观模式,也称门面模式 * * 优点:为了解决类与类之间的依赖关系,降低了类与类之间的耦合度 *

java设计模式之九外观模式(Facade)

外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口,看下类图:(我们以一个计算机的启动过程为例) 我们先看下实现类: [java] view plaincopy public class CPU { public void startup(){ System.out.println("cpu startup!"); } public vo

java设计模式之外观模式(门面模式)

针对外观模式,在项目开发和实际运用中十分频繁,但是其极易理解,下面就简要介绍一下. 一.概念介绍 外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口.这种类型的设计模式属于结构性模式.为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用. 二.角色及使用场景 简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用.这个模式中,设计到3个角色. 1).门面角色:外观模式的核心.它被客户角色调用,它熟悉子系统的功

11.设计模式_外观模式

一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 "门面"模式.下面就具体介绍下外观模式. 二.外观模式的详细介绍 2.1 定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内

Head First设计模式之外观模式

一.定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用. 外观模式不只是简化了接口,也将客户从组件的子系统中解耦. 外观和适配器可以包装许多类,但是外观强调的是简化接口,而适配器是为了将接口转换成不同的接口. 二.结构 外观角色(Facade):是模式的核心,他被客户client角色调用,知道各个子系统的功能.同时根据客户角色已有的需求预订了几种功能组合子系统角色(Subsystem classes):实现子系统的功能,并处理由Facade