目录
上述代码 GitHub 地址:https://github.com/baicun/designPatterns
外观模式:
提供一个高层接口,抽象了一系列接口的功能,使用者只关注外观,无需关注具体设备实现。
外观优点:
不同对象之间解耦
外观模式应用:
智能家庭影院
外观模式和命令模式区别
外观模式侧重一个统一的高层接口,外观可视,无需关心操作背后的开关、音量变化、网络连接等
命令模式侧重不同接口的解耦,宏命令也可以实现和外观模式一样的操作。
外观实例:
类图:
设备类-DVDPlayer.java
public class DVDPlayer {
private volatile static DVDPlayer instance = null;//volatile 原子性,有序性,可见性
// 私有构造方法
private DVDPlayer(){
}
// 静态工厂创建
public static DVDPlayer getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new DVDPlayer();
}
}
}
return instance;
}
public void on() {
System.out.println("DVDPlayer On");
}
public void off() {
System.out.println("DVDPlayer Off");
}
public void play() {
System.out.println("DVDPlayer is playing");
}
public void pause() {
System.out.println("DVDPlayer pause");
}
public void setdvd() {
System.out.println("DVDPlayer is setting dvd");
}
}
设备-Stereo.java
public class Stereo {
private volatile static Stereo instance = null;
private int volume = 5;
private Stereo(){
}
public static Stereo getInstance(){
if(instance == null){
synchronized (Singleton.class){
if (instance == null) {
instance = new Stereo();
}
}
}
return instance;
}
public void on() {
System.out.println("Stereo On");
}
public void off() {
System.out.println("Stereo Off");
}
public void setVolume(int vol) {
volume = vol;
System.out.println("the volume of Stereo is set to " + volume);
}
public void addVolume() {
if (volume < 11) {
volume++;
setVolume(volume);
}
}
public void subVolume() {
if (volume > 0) {
volume--;
setVolume(volume);
}
}
}
对外提供接口类-HomeTheaterFacade.java
public class HomeTheaterFacade {
private Stereo mStereo;
private DVDPlayer dvdPlayer;
public HomeTheaterFacade(){
this.mStereo = Stereo.getInstance();
this.dvdPlayer = DVDPlayer.getInstance();
}
//开启设备
public void ready() {
mStereo.on();
dvdPlayer.on();
}
//关闭设备
public void end() {
mStereo.off();
dvdPlayer.off();
}
//设备运转
public void play(){
dvdPlayer.play();
}
//dvd暂停
public void pause(){
dvdPlayer.pause();
}
}
测试类:
public class MainTest {
public static void main(String[] args){
HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();
homeTheaterFacade.ready();
homeTheaterFacade.play();
}
}