外观模式(Facade)----设计模式
什么是外观模式呢?
以我们中常见的案例说明,当我们需要安装win10电脑系统时,不需要了解安装系统的每一部分细节,交给固定程序进行安装即可;当我们去医院看病时,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便;等等…
外观模式就是将事件内部具体的细节封装起来,使使用者能够更加方便地完成需求。
即通过定义一个一致的接口(界面类),用以屏蔽内部子系统的细节,使得调用端只需要跟这个接口发生调用,而无需关心这个子系统的内部细节。
外观模式的基本介绍
制造一个影院管理?
假如现在要制作一个影院管理项目,如果我们要求完成使用家庭影院的功能,一个个调用使用这些方法实在过于繁琐,结构混乱。
通常情况下,电影院只会提供电影播放的准备工作、开始播放、暂停播放、结束播放的工作,此时我们就可以使用外观模式实现这一效果。
实现代码
爆米花类
package com.design_patterns.facade;
/**
* 定义爆米花机器类
*/
public class PopCorn {
private static PopCorn instance = new PopCorn();
private PopCorn(){
};
public static PopCorn getInstance(){
return instance;
}
public void on(){
System.out.println(" popcorn on ");
}
public void off(){
System.out.println(" popcorn off ");
}
public void pop(){
System.out.println(" popcorn pop ");
}
}
DVD播放器类
package com.design_patterns.facade;
/**
* 定义DVDPlayer播放类
*/
public class DVDPlayer {
//使用单例模式(饿汉式)
private static DVDPlayer instance = new DVDPlayer();
//构造方法私有化
private DVDPlayer(){
};
//获取单例模式对象
public static DVDPlayer getInstance(){
return instance;
}
public void on(){
System.out.println(" dvd on ");
}
public void off(){
System.out.println(" dvd off ");
}
public void play(){
System.out.println(" dvd is playing ");
}
public void pause(){
System.out.println(" dvd pause ");
}
}
放映机类
package com.design_patterns.facade;
/**
* 定义放映机类
*/
public class Projector {
private static Projector instance = new Projector();
private Projector(){
};
public static Projector getInstance(){
return instance;
}
public void on(){
System.out.println(" Projector on ");
}
public void off(){
System.out.println(" Projector off ");
}
public void focus(){
System.out.println(" Projector focus ");
}
}
屏幕类(荧屏)
package com.design_patterns.facade;
/**
* 定义屏幕
*/
public class Screen {
//使用单例模式(饿汉式)
private static Screen instance = new Screen();
//构造方法私有化
private Screen(){
};
//获取单例模式对象
public static Screen getInstance(){
return instance;
}
public void up(){
System.out.println(" screen up ");
}
public void down(){
System.out.println(" screen down ");
}
}
音响类
package com.design_patterns.facade;
/**
* 定义音箱,输出影片声音
*/
public class Stereo {
//使用单例模式(饿汉式)
private static Stereo instance = new Stereo();
//构造方法私有化
private Stereo(){
};
//获取单例模式对象
public static Stereo getInstance(){
return instance;
}
public void on(){
System.out.println(" stereo on ");
}
public void off(){
System.out.println(" stereo off ");
}
public void up(){
System.out.println(" stereo up ");
}
public void down(){
System.out.println(" stereo down ");
}
}
影院灯光类
package com.design_patterns.facade;
/**
* 定义电影院内的灯光类
*/
public class TheaterLight {
//使用单例模式(饿汉式)
private static TheaterLight instance = new TheaterLight();
//构造方法私有化
private TheaterLight(){
};
//获取单例模式对象
public static TheaterLight getInstance(){
return instance;
}
public void on(){
System.out.println(" TheaterLight on ");
}
public void off(){
System.out.println(" TheaterLight off ");
}
public void bright(){
System.out.println(" TheaterLight bright ");
}
public void dim() {
System.out.println(" TheaterLight dim ");
}
}
电影院类,即外观模式的实现
package com.design_patterns.facade;
/**
* 定义电影院类,通过方法封装各个子部分的实现细节
*/
public class HomeTheaterFacade {
//定义各个子系统的对象
private DVDPlayer dvdPlayer;
private PopCorn popCorn;
private Projector projector;
private Screen screen;
private Stereo stereo;
private TheaterLight theaterLight;
//通过构造方法为电影院各个子系统部分获取实例化对象
public HomeTheaterFacade(){
this.dvdPlayer = DVDPlayer.getInstance();
this.popCorn = PopCorn.getInstance();
this.projector = Projector.getInstance();
this.screen = Screen.getInstance();
this.stereo = Stereo.getInstance();
this.theaterLight = TheaterLight.getInstance();
}
//操作分为 4 步
/**
* 进行准备工作
*/
public void ready(){
System.out.println("----- 电影院准备放映影片 -----");
popCorn.on();
popCorn.pop();
screen.down();
projector.on();
stereo.on();
dvdPlayer.on();
theaterLight.dim();
}
/**
* 电影院开始放电影工作
*/
public void play(){
System.out.println("----- 电影院开始放映影片 -----");
dvdPlayer.play();
}
/**
* 电影院进行暂停工作
*/
public void pause(){
System.out.println("----- 电影院暂停放映影片 -----");
dvdPlayer.pause();
}
/**
* 电影院电影放映结束动作
*/
public void end(){
System.out.println("----- 电影院结束放映影片 -----");
popCorn.off();
theaterLight.bright();
screen.up();
projector.off();
stereo.off();
dvdPlayer.off();
}
}
客户端(测试)类
package com.design_patterns.facade;
public class Client {
public static void main(String[] args) {
HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();
homeTheaterFacade.ready(); //电影院准备工作
homeTheaterFacade.play(); //电影院开始放电影
homeTheaterFacade.pause(); //电影院暂停放电影
homeTheaterFacade.end(); //电影院结束影片放映
}
}
运行结果
----- 电影院准备放映影片 -----
popcorn on
popcorn pop
screen down
Projector on
stereo on
dvd on
TheaterLight dim
----- 电影院开始放映影片 -----
dvd is playing
----- 电影院暂停放映影片 -----
dvd pause
----- 电影院结束放映影片 -----
popcorn off
TheaterLight bright
screen up
Projector off
stereo off
dvd off
总结
嘻嘻,感觉外观模式非常容易理解,本质就是将事件的实现细节通过一个一致界面进行封装,最后调用封装实现功能即可,好啦,就到这里,加油~~~