外观模式
摘要
本文通过简洁的模式描述,应用场景的详细代码实现,以及匹配的UML,详解介绍了外观模式的原理及应用。本文可帮助读者快速掌握外观模式,以便工作学习中使用外观模式。
一、外观模式
在一家烧烤店中,有羊肉串、牛肉串、茄子,现来了三位顾客张三、李四、王五,他们的点餐各不相同,张三要5串羊肉串、10串牛肉串;李四要10串羊肉串、15串牛肉串、1个茄子;王五要5串羊肉串、2个茄子。将烧烤店的商品看成一个集合,把客户看成第二集合,由此可见两个集合之间的关系比较复杂和多变。
在编程时,也会出现两个集合对象之间关系无规则且多变的情况。若在任一集合中添加一个对象,都会让两个集合之间的关系更为复杂,这样的代码不利于我们后期的维护和扩展。
外观模式则是为这一问题提出了解决方案。在烧烤店中,我们加入一个服务员,让所有顾客向服务员点餐,同时食物也直接给服务员,这样关系网络不在是网状,而是“多 <——> 1 <——> 多”的关系,实现了食物与顾客之间的解耦。在两个集合对象中,可以在中间加入一个“服务”对象即可,让两个集合都通过服务对象与另一个集合发生关系,这样就会改善网状关系。
二、外观模式的实现
2.1 场景设计
KFC中有薯条、炸鸡、汉堡、可乐、果汁,顾客可以通过前台服务员进行点餐。
2.2 代码实现
2.2.1 Facade 服务员角色
package ft.patterns.facade;
public class Facade {
private Chips chips;
private Hamburger hamburger;
private FriedChicken friedChicken;
private FruitJuice fruitJuice;
private Cola cola;
public Facade(Chips chips, Hamburger hamburger, FriedChicken friedChicken, FruitJuice fruitJuice, Cola cola) {
this.chips = chips;
this.hamburger = hamburger;
this.friedChicken = friedChicken;
this.fruitJuice = fruitJuice;
this.cola = cola;
}
public void packageA() {
chips.cookingChips();
friedChicken.cookingFriedChicken();
System.out.println("PackageA is complete.");
}
public void packageB() {
chips.cookingChips();
friedChicken.cookingFriedChicken();
cola.cookingCola();
System.out.println("PackageB is complete.");
}
public void packageC() {
hamburger.cookingHamburger();
friedChicken.cookingFriedChicken();
fruitJuice.cookingFruitJuice();
System.out.println("PackageC is complete.");
}
}
2.2.2 Chips 薯条
package ft.patterns.facade;
public class Chips {
public void cookingChips() {
System.out.println("It is cooking Chips.");
}
}
2.2.3 FriedChicken 炸鸡
package ft.patterns.facade;
public class FriedChicken {
public void cookingFriedChicken() {
System.out.println("It is cooking FriedChicken.");
}
}
2.2.4 Hamburger 汉堡
package ft.patterns.facade;
public class Hamburger {
public void cookingHamburger() {
System.out.println("It is cooking Hamburger.");
}
}
2.2.5 Cola 可乐
package ft.patterns.facade;
public class Cola {
public void cookingCola() {
System.out.println("It is cooking Cola.");
}
}
2.2.6 FruitJuice 果汁
package ft.patterns.facade;
public class FruitJuice {
public void cookingFruitJuice() {
System.out.println("It is cooking FruitJuice.");
}
}
2.2.7 Main 测试类
package ft.patterns.facade;
public class Main {
public static void main(String[] args) {
Chips chips = new Chips();
Hamburger hamburger = new Hamburger();
FriedChicken friedChicken = new FriedChicken();
FruitJuice fruitJuice = new FruitJuice();
Cola cola = new Cola();
Facade kfcFacade = new Facade(chips, hamburger, friedChicken, fruitJuice, cola);
kfcFacade.packageA();
System.out.println();
kfcFacade.packageB();
System.out.println();
kfcFacade.packageC();
}
}
2.2.8 测试结果
It is cooking Hamburger.
It is cooking FriedChicken.
It is cooking FruitJuice.
PackageC is complete.