设计模式GOF23--外观模式

迪米特法则(最少知识原则)

  • 一个软件实体应当尽可能少的与其他实体发生相互作用

外观模式的核心

  • 为子系统提供统一的入口,封装子系统的复杂性,便于客户端被调用。

基本案例(泡茶流程代码解析)

准备必要工具(茶具、茶叶、水、喝茶的人)

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/**
* 茶具接口
*/
public interface TeaSet {
void useTeaSet();
}

class CoveredTeaSet implements TeaSet{
@Override
public void useTeaSet() {
System.out.println("使用盖碗茶具");
}
}

class FlowerReceptacle implements TeaSet{
@Override
public void useTeaSet() {
System.out.println("使用玻璃杯");
}
}

class DarkRedEnameledPottery implements TeaSet{
@Override
public void useTeaSet() {
System.out.println("使用紫砂壶");
}
}

/**
* 茶叶
*/
public interface Tea {
void useTea();
}

class BiluochunTea implements Tea{
@Override
public void useTea() {
System.out.println("使用碧螺春");
}
}

class JasmineTea implements Tea{
@Override
public void useTea() {
System.out.println("使用茉莉花茶");
}
}

class PuerTea implements Tea{
@Override
public void useTea() {
System.out.println("使用普洱");
}
}



/**
* 水
*/
public interface Water {
void useWater();
}

class BoilingWater80 implements Water{
@Override
public void useWater() {
System.out.println("使用80度开水");
}
}

class BoilingWater90 implements Water{
@Override
public void useWater() {
System.out.println("使用90度开水");
}
}

class BoilingWater100 implements Water{
@Override
public void useWater() {
System.out.println("使用100度开水");
}
}

/**
* 人
*/
public class People {
String name;

public People(String name) {
this.name = name;
}

public People() {
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

使用非外观者模式自己泡茶

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 外观模式 调用者
*/
public class Client {

public static void main(String[] args) {
/**
* 使用非外观者模式 泡茶
*/
People huangYaoShi = new People("黄药师");
TeaSet darkRedEnameledPottery = new DarkRedEnameledPottery();
darkRedEnameledPottery.useTeaSet();
Tea puerTea = new PuerTea();
puerTea.useTea();
Water boilingWater100 = new BoilingWater100();
boilingWater100.useWater();
System.out.println(huangYaoShi.getName()+"自己泡茶");
}
}
结果:
使用紫砂壶
使用普洱
使用100度开水
黄药师自己泡茶

由上可以看出自己泡茶需要调用的东西极多,颇为复杂。

使用外观者模式茶馆喝茶

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
48
49
50
51
52
53
54
55
56
57
58
59
/**
* 泡茶流程的门面对象(茶馆)
*/
public class MakeTea {
public void make(String teaName,String username){
TeaSet teaSet = null;
Tea tea = null;
Water water = null;
switch (teaName){
case "puer":
teaSet = new DarkRedEnameledPottery();
teaSet.useTeaSet();
tea = new PuerTea();
tea.useTea();
water = new BoilingWater100();
water.useWater();
System.out.println("为"+username+"泡茶");
break;
case "biluochun":
teaSet = new CoveredTeaSet();
teaSet.useTeaSet();
tea = new BiluochunTea();
tea.useTea();
water = new BoilingWater80();
water.useWater();
System.out.println("为"+username+"泡茶");
break;
case "jasmine":
teaSet = new FlowerReceptacle();
teaSet.useTeaSet();
tea = new JasmineTea();
tea.useTea();
water = new BoilingWater90();
water.useWater();
System.out.println("为"+username+"泡茶");
break;
default:
this.make("jasmine",username);
break;
}

}
}


/**
* 外观模式 调用者
*/
public class Client {

public static void main(String[] args) {
/**
* 使用外观者模式泡茶
*/
MakeTea makeTea = new MakeTea();
People ouyangfeng = new People("欧阳锋");
makeTea.make("biluochun",ouyangfeng.getName());
}
}
结果:
使用盖碗茶具
使用碧螺春
使用80度开水
为欧阳锋泡茶

所以,自己泡茶还是茶馆喝茶,你,选择好了吗?

开发中常用的场景

  • 频率很高。哪里都会遇到。各种技术和框架中,都有外观模式的使用。如:
    • JDBC封装后,commons提供的DBUtils类,Hibernate提供的工具类、Spring JDBC工具类等。
注:该博文为学习总结,视频来源为高淇java300集