服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java设计模式之外观模式示例详解

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

2022-08-16 09:17温故知新之java 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();
    }
}

查看测试结果

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

分析

我们通过家庭影院外观类HomeTheaterFacade的ready,play,end方法操作了播放器,投影仪等的打开,关闭,对于家庭影院外观类来说,他是不需要知道播放器,投影仪等的打开,关闭具体是怎么样实现的。在一定程度上实现了解耦,易维护和扩展。

总结

优势:

1.外观模式对外屏蔽了子系统的实现细节(安全性)

2.外观模式降低了客户端与子系统交互的复杂性,对客户端和子系统进行解耦合,子系统内部的模块更容易维护和扩展

3.通过合理的使用外观模式,可以帮助我们更好的划分访问层次

使用场景

1.对分层的系统进行构建时,使用外观模式可以简化子系统之间的依赖关系

2.当有一个复杂的系统,里面有很多子系统,有大量的操作,这时候可以使用外观模式

3.当客户端与多个子系统之间存在很多耦合时,引入外观模式,可以将他们分离,提高子系统的独立性和可移植性

以上就是Java设计模式之外观模式示例详解的详细内容,更多关于Java外观模式的资料请关注服务器之家其它相关文章!

原文链接:https://juejin.cn/post/7070405252951834637

延伸 · 阅读

精彩推荐