外观模式-简化子系统的复杂性
目录
公号:码农充电站pro
今天来介绍外观模式(Facade Design Pattern)。
1,外观模式
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容易使用。
外观模式的类图如下:
Facede 简化了原来的非常复杂的子系统,使得子系统更易使用,Client 只需依赖 Facede 即可。
虽然有了 Facede ,但 Facede 并影响原来的子系统,也就是其它客户依然可以使用原有系统。
2,最少知识原则
最少知识原则告诉我们,应该尽量减少对象之间的交互,只与自己最需要的接口建立关系。
在设计系统时,不应该让太多的类耦合在一起,以免一小部分的改动,而影响到整个系统的使用。
这也就是我们俗话说的:牵一发而动全身,最少知识原则的就是让我们避免这种情况的发生。
外观模式则使用了最少知识原则。
3,外观模式举例
下面举一个简单的例子,来体会下外观模式的使用。俗话说:民以食为天。我们来举一个吃饭的例子。
话说,小明每次吃饭都要经过以下步骤:
- 去超市买菜。
- 回到家后,洗菜。
- 炒菜。
- 煮饭。
- 将饭菜盛到碗里。
- 吃饭。
- 洗碗。
可见小明吃一顿饭真的很麻烦。
我们用代码来模拟上面的过程,首先创建了三个类,分别是关于菜,饭,碗的操作:
class Vegetables {
public void bugVegetables() {
System.out.println("buying vegetables.");
}
public void washVegetables() {
System.out.println("washing vegetables.");
}
public void fryVegetables() {
System.out.println("frying vegetables.");
}
public void toBowl() {
System.out.println("putting the vegetables into the bowl.");
}
}
class Rice {
public void fryRice() {
System.out.println("frying rice.");
}
public void toBowl() {
System.out.println("putting the rice into the bowl.");
}
}
class Bowl {
private Vegetables vegetables;
private Rice rice;
public Bowl(Vegetables vegetables, Rice rice) {
this.vegetables = vegetables;
this.rice = rice;
}
// 盛好饭菜
public void prepare() {
vegetables.toBowl();
rice.toBowl();
}
public void washBowl() {
System.out.println("washing bowl.");
}
}
小明每次吃饭都需要与上面三个类做交互,而且需要很多步骤,如下:
Vegetables v = new Vegetables();
v.bugVegetables();
v.washVegetables();
v.fryVegetables();
Rice r = new Rice();
r.fryRice();
Bowl b = new Bowl(v, r);
b.prepare();
System.out.println("xiao ming is having a meal.");
b.washBowl();
后来,小明请了一位保姆,来帮他做饭洗碗等。所以我们创建了 Nanny
类:
class Nanny {
private Vegetables v;
private Rice r;
private Bowl b;
public Nanny() {
v = new Vegetables();
r = new Rice();
b = new Bowl(v, r);
}
public void prepareMeal() {
v.bugVegetables();
v.washVegetables();
v.fryVegetables();
r.fryRice();
b.prepare();
}
public void cleanUp() {
b.washBowl();
}
}
这样,小明再吃饭的时候就只需要跟保姆说一声,保姆就帮他做好了所有的事情:
Nanny n = new Nanny();
n.prepareMeal();
System.out.println("xiao ming is having a meal.");
n.cleanUp();
这样大大简化了小明吃饭的步骤,也节约了很多时间。
我将完整的代码放在了这里,供大家参考。
4,总结
外观模式主要用于简化系统的复杂度,为客户提供更易使用的接口,减少客户对复杂系统的依赖。
从外观模式中我们也能看到最少知识原则的运用。
(本节完。)
推荐阅读:
欢迎关注作者公众号,获取更多技术干货。
文章作者 @码农加油站
上次更改 2021-01-03