🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解桥接模式请看: (九)趣学设计模式 之 桥接模式!
这篇文章带你详细认识一下设计模式中的外观模式
一、 啥是外观模式?
想象一下,你想做一道复杂的菜 🍲 (比如:佛跳墙),你需要准备各种食材 🥕🍄🍖、处理食材 🔪、烹饪食材 🔥等等一系列操作。 如果每次做菜都要手动完成这些步骤,是不是很麻烦 😫? 这时候你可以使用一个“一键烹饪包” 📦,只需要按照说明书操作,就可以自动完成所有步骤!
外观模式,就是为子系统中的一组接口提供一个统一的接口! 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 ➕。
简单来说,就是提供一个“傻瓜式”的操作界面,隐藏复杂的内部逻辑! 📦
- 你想简化复杂系统的使用: 就像你想用一个“一键烹饪包”做出复杂的菜 🍲!
- 你想降低子系统之间的耦合度: 就像你不想让用户直接依赖于各种食材和烹饪步骤 🥕🍄🍖🔪🔥!
- 你想为不同的用户提供不同的接口: 就像你想为新手提供简单的烹饪包,为厨师提供更详细的食材和烹饪方法 👨🍳!
二、 为什么要用外观模式?
用外观模式,好处多多 👍:
- 简化接口: 为复杂系统提供一个简单的接口 📦!
- 降低耦合度: 减少客户端与子系统之间的依赖 🔗!
- 提高灵活性: 可以方便地修改子系统的内部实现,而不会影响客户端 🤸!
- 提高安全性: 可以控制客户端对子系统的访问权限 🔒!
三、 外观模式的实现方式
外观模式主要包含以下几个角色:
- Facade(外观类): 为子系统中的一组接口提供一个统一的接口。 📦 (比如:“一键烹饪包”)
- SubSystem(子系统): 实现子系统的功能,处理Facade对象指派的任务。 🥕🍄🍖🔪🔥 (比如:食材准备、食材处理、烹饪)
代码示例:
// 子系统:食材准备
public class IngredientPreparation {
public void prepareVegetables() {
System.out.println("准备蔬菜");
}
public void prepareMeat() {
System.out.println("准备肉类");
}
}
// 子系统:食材处理
public class IngredientProcessing {
public void chopVegetables() {
System.out.println("切菜");
}
public void marinateMeat() {
System.out.println("腌制肉类");
}
}
// 子系统:烹饪
public class Cooking {
public void stirFry() {
System.out.println("翻炒");
}
public void simmer() {
System.out.println("炖煮");
}
}
// 外观类:“一键烹饪包”
public class OneClickCookingPackage {
private IngredientPreparation preparation;
private IngredientProcessing processing;
private Cooking cooking;
public OneClickCookingPackage() {
this.preparation = new IngredientPreparation();
this.processing = new IngredientProcessing();
this.cooking = new Cooking();
}
public void cookDish() {
System.out.println("开始烹饪...");
preparation.prepareVegetables(); // 准备蔬菜
preparation.prepareMeat(); // 准备肉类
processing.chopVegetables(); // 切菜
processing.marinateMeat(); // 腌制肉类
cooking.stirFry(); // 翻炒
cooking.simmer(); // 炖煮
System.out.println("烹饪完成!");
}
}
// 客户端
public class Client {
public static void main(String[] args) {
OneClickCookingPackage cookingPackage = new OneClickCookingPackage(); // 创建“一键烹饪包”对象
cookingPackage.cookDish(); // 开始烹饪
}
}
分析:
IngredientPreparation
,IngredientProcessing
,Cooking
是子系统,分别实现了食材准备、食材处理和烹饪的功能。OneClickCookingPackage
是外观类,组合了子系统对象,并提供了cookDish()
方法,简化了烹饪的操作。
输出结果:
开始烹饪...
准备蔬菜
准备肉类
切菜
腌制肉类
翻炒
炖煮
烹饪完成!
四、 外观模式的优缺点
优点:
- 简化接口 📦!
- 降低耦合度 🔗!
- 提高灵活性 🤸!
- 提高安全性 🔒!
缺点:
- 不能很好地限制客户使用子系统类,如果客户知道子系统类,还是可以直接使用 😫!
- 不符合开闭原则,如果需要增加新的子系统,需要修改外观类 😫!
五、 外观模式的应用场景
- 当你要为一个复杂子系统提供一个简单接口时: 就像“一键烹饪包” 🍲!
- 当客户程序与多个子系统之间存在很大的依赖性时: 就像客户端需要直接操作各种食材和烹饪步骤 🥕🍄🍖🔪🔥!
- 当你需要构建一个层次结构的子系统时,使用外观模式定义子系统中每层的入口点: 就像为不同的用户提供不同的烹饪方法 👨🍳!
- 编译器: 编译器可以将复杂的编译过程封装起来,对外提供一个简单的编译接口。
六、 总结
- 外观模式就像提供一个“傻瓜式”的操作界面,隐藏复杂的内部逻辑! 📦
- 主要包含外观类和子系统两个角色! 🎭
- 优点是简化接口、降低耦合度、提高灵活性、提高安全性! 👍
- 缺点是不能很好地限制客户使用子系统类、不符合开闭原则! 👎
- 适用于需要简化复杂系统的使用,或者需要降低子系统之间耦合度的场景! 🎯
希望这个例子能让你更容易理解外观模式! 💯 祝你学习愉快! 😄
看完请看:(十 一)趣学设计模式 之 组合模式!