定义
外观模式为多个复杂的子系统,提供了一个一致的界面,使得调用端只和这个接口发生调用,而无须关系这个子系统内部的细节
案例
需求
看电影的时候需要进行一系列的操作,比如打开播放器,放下屏幕,打开投影仪,打开音响等,这个要怎么进行管理呢
方案:外观模式实现
定义播放器类
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public class Player {
private static Player player = new Player();
private Player(){}
public static Player getInstance(){
return player; }
public void on(){ System.out.println( "打开播放器" ); }
public void off(){ System.out.println( "关闭播放器" ); }
public void play(){ System.out.println( "使用播放器播放电影" ); }
public void pause(){ System.out.println( "暂停播放器" ); }
public void select(){ System.out.println( "选择喜欢的电影" ); } } |
定义投影仪类
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public class Projector {
private static Projector projector = new Projector();
private Projector(){}
public static Projector getInstance(){
return projector; }
public void on(){ System.out.println( "放下屏幕,打开投影仪" ); }
public void off(){ System.out.println( "关闭投影仪" ); }
public void focus(){ System.out.println( "调节投影仪焦距" ); }
public void zoom(){ System.out.println( "投影仪变焦" ); }
} |
定义音响类
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class Stereo {
private static Stereo stereo = new Stereo();
private Stereo(){}
public static Stereo getInstance(){ return stereo; }
public void on(){ System.out.println( "打开音响" ); }
public void off(){ System.out.println( "关闭音响" ); }
public void setVolume(){ System.out.println( "调节音响音量" ); } } |
定义爆米花机类
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
/** * 爆米花机 * @author:liyajie * @createTime:2022/3/2 14:24 * @version:1.0 */ public class Popcorn {
private static Popcorn popcorn = new Popcorn();
private Popcorn(){}
public static Popcorn getInstance(){ return popcorn; }
public void on(){ System.out.println( "打开爆米花机" ); }
public void off(){ System.out.println( "关闭爆米花机" ); }
public void pop(){ System.out.println( "制作爆米花" ); } } |
定义家庭影院外观类
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
public class HomeTheaterFacade {
// 聚合各个子系统 private Player player;
private Popcorn popcorn;
private Projector projector;
private Stereo stereo;
public HomeTheaterFacade(){
}
// 全参构造器 public HomeTheaterFacade(Player player, Popcorn popcorn,Projector projector,Stereo stereo){ this .player = player; this .popcorn = popcorn; this .projector = projector; this .stereo = stereo; }
// 准备阶段 public void ready(){ popcorn.on(); player.on(); projector.on(); stereo.on(); }
// 播放 public void play(){ player.select(); popcorn.pop(); projector.focus(); stereo.setVolume(); }
// 结束 public void end(){ player.off(); popcorn.off(); projector.off(); stereo.off(); } } |
定义测试类
|
1 2 3 4 5 6 7 8 |
public class Test { public static void main(String[] args) { HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade(Player.getInstance(),Popcorn.getInstance(),Projector.getInstance(),Stereo.getInstance()); homeTheaterFacade.ready(); homeTheaterFacade.play(); homeTheaterFacade.end(); } } |
查看测试结果
分析
我们通过家庭影院外观类HomeTheaterFacade的ready,play,end方法操作了播放器,投影仪等的打开,关闭,对于家庭影院外观类来说,他是不需要知道播放器,投影仪等的打开,关闭具体是怎么样实现的。在一定程度上实现了解耦,易维护和扩展。
总结
优势:
1.外观模式对外屏蔽了子系统的实现细节(安全性)
2.外观模式降低了客户端与子系统交互的复杂性,对客户端和子系统进行解耦合,子系统内部的模块更容易维护和扩展
3.通过合理的使用外观模式,可以帮助我们更好的划分访问层次
使用场景
1.对分层的系统进行构建时,使用外观模式可以简化子系统之间的依赖关系
2.当有一个复杂的系统,里面有很多子系统,有大量的操作,这时候可以使用外观模式
3.当客户端与多个子系统之间存在很多耦合时,引入外观模式,可以将他们分离,提高子系统的独立性和可移植性
以上就是Java设计模式之外观模式示例详解的详细内容,更多关于Java外观模式的资料请关注其它相关文章!
原文链接:https://juejin.cn/post/7070405252951834637
查看更多关于Java设计模式之外观模式示例详解的详细内容...