好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java设计模式之外观模式示例详解

定义

外观模式为多个复杂的子系统,提供了一个一致的界面,使得调用端只和这个接口发生调用,而无须关系这个子系统内部的细节

案例

需求

看电影的时候需要进行一系列的操作,比如打开播放器,放下屏幕,打开投影仪,打开音响等,这个要怎么进行管理呢

方案:外观模式实现

定义播放器类

?

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设计模式之外观模式示例详解的详细内容...

  阅读:29次