设计模式之外观模式

xiaoxiao2021-02-28  78

外观模式定义

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

详解外观模式

外观模式的意图是简化接口。当实现某个行为时,需要依赖子系统的许多类,而且使用复杂,就可以考虑使用外观模式,提供一个简化并统一的接口。这样客户只需对外观类编程,从而将客户从一个复杂的子系统中解耦。

从下面的简易的类图可以更清晰的理解外观模式:

示例

本例是一个智能手机示例。子系统包括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 Patterns/src/main/java/com/yrs/facade

转载请注明原文地址: https://www.6miu.com/read-97357.html

最新回复(0)