外观模式定义
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用
详解外观模式
外观模式的意图是简化接口。当实现某个行为时,需要依赖子系统的许多类,而且使用复杂,就可以考虑使用外观模式,提供一个简化并统一的接口。这样客户只需对外观类编程,从而将客户从一个复杂的子系统中解耦。
从下面的简易的类图可以更清晰的理解外观模式:
示例
本例是一个智能手机示例。子系统包括Phone类、Internet类、Music类、MusicPlayer类,它们分别用于打电话、上网、播放音乐。利用外观模式新建了一个简化的接口:Smartphone类,Smartphone类统一对外服务。
示例类图
程序
Phone类
public class Phone {
public void callPhone(String phoneNumber) {
System.out.println("拨通电话 " + phoneNumber);
}
public void endPhone() {
System.out.println("挂断电话");
}
}
Internet类
public class Internet {
public void openWeb(String webName) {
System.out.println("打开网站:" + webName);
}
public void endWeb() {
System.out.println("关闭网站");
}
public Music downloadMusic(String musicName) {
System.out.println("下载音乐:" + musicName);
String content = "网络下载音乐:" + musicName;
return new Music(musicName, content);
}
}
MusicPlayer类
public class MusicPlayer {
public void playMusic(String musicName) {
Music music = searchMusic(musicName);
System.out.println("播放音乐:" + music.getContent());
}
public void endPlay() {
System.out.println("关闭音乐");
}
private Music searchMusic(String musicName) {
//模拟本地是否有该音乐,如果没有则通过Internet类下载音乐
Random random = new Random();
if (random.nextInt(4) % 2 == 0) {
String content = "本地音乐:" + musicName;
return new Music(musicName, content);
}else {
Internet internet = new Internet();
return internet.downloadMusic(musicName);
}
}
}
Music类
public class Music {
private String name;
private String content;
public Music(String name, String content) {
this.name = name;
this.content= content;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
Smartphone类
public class SmartPhone {
private Phone phone = new Phone();
private Internet internet = new Internet();
private MusicPlayer musicPlayer = new MusicPlayer();
public void callPhone(String phoneNumber) {
phone.callPhone(phoneNumber);
}
public void endPhone() {
phone.endPhone();
}
public void openWeb(String webName) {
internet.openWeb(webName);
}
public void endWeb() {
internet.endWeb();
}
public void playMusic(String musicName) {
musicPlayer.playMusic(musicName);
}
public void endMusic() {
musicPlayer.endPlay();
}
}
测试类TestFacade
public class TestFacade {
public static void main(String [] args) {
SmartPhone smartPhone = new SmartPhone();
smartPhone.callPhone("18888888888");
smartPhone.endPhone();
smartPhone.openWeb("https://github.com/ByrsH");
smartPhone.endWeb();
smartPhone.playMusic("山丘");
smartPhone.endMusic();
}
}
输出:
拨通电话 18888888888
挂断电话
打开网站:https://github.com/ByrsH
关闭网站
下载音乐:山丘
播放音乐:网络下载音乐:山丘
关闭音乐
外观模式符合面向对象设计中的“最少知识”原则,也叫“墨忒耳法则(Law of Demeter)”。该原则告诉我们要减少对象之间的交互,只和你的“密友”谈话。
代码下载:https://github.com/ByrsH/Design-Patterns/tree/master/Design%20Patterns/src/main/java/com/yrs/facade