(十)趣学设计模式 之 外观模式!

目录

    • [一、 啥是外观模式?](#一、 啥是外观模式?)
    • [二、 为什么要用外观模式?](#二、 为什么要用外观模式?)
    • [三、 外观模式的实现方式](#三、 外观模式的实现方式)
    • [四、 外观模式的优缺点](#四、 外观模式的优缺点)
    • [五、 外观模式的应用场景](#五、 外观模式的应用场景)
    • [六、 总结](#六、 总结)

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解桥接模式请看: (九)趣学设计模式 之 桥接模式!

这篇文章带你详细认识一下设计模式中的外观模式

一、 啥是外观模式?

想象一下,你想做一道复杂的菜 🍲 (比如:佛跳墙),你需要准备各种食材 🥕🍄🍖、处理食材 🔪、烹饪食材 🔥等等一系列操作。 如果每次做菜都要手动完成这些步骤,是不是很麻烦 😫? 这时候你可以使用一个"一键烹饪包" 📦,只需要按照说明书操作,就可以自动完成所有步骤!

外观模式,就是为子系统中的一组接口提供一个统一的接口! 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 ➕。

简单来说,就是提供一个"傻瓜式"的操作界面,隐藏复杂的内部逻辑! 📦

  • 你想简化复杂系统的使用: 就像你想用一个"一键烹饪包"做出复杂的菜 🍲!
  • 你想降低子系统之间的耦合度: 就像你不想让用户直接依赖于各种食材和烹饪步骤 🥕🍄🍖🔪🔥!
  • 你想为不同的用户提供不同的接口: 就像你想为新手提供简单的烹饪包,为厨师提供更详细的食材和烹饪方法 👨‍🍳!

二、 为什么要用外观模式?

用外观模式,好处多多 👍:

  • 简化接口: 为复杂系统提供一个简单的接口 📦!
  • 降低耦合度: 减少客户端与子系统之间的依赖 🔗!
  • 提高灵活性: 可以方便地修改子系统的内部实现,而不会影响客户端 🤸!
  • 提高安全性: 可以控制客户端对子系统的访问权限 🔒!

三、 外观模式的实现方式

外观模式主要包含以下几个角色:

  • Facade(外观类): 为子系统中的一组接口提供一个统一的接口。 📦 (比如:"一键烹饪包")
  • SubSystem(子系统): 实现子系统的功能,处理Facade对象指派的任务。 🥕🍄🍖🔪🔥 (比如:食材准备、食材处理、烹饪)

代码示例:

java 复制代码
// 子系统:食材准备
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() 方法,简化了烹饪的操作。

输出结果:

开始烹饪...
准备蔬菜
准备肉类
切菜
腌制肉类
翻炒
炖煮
烹饪完成!

四、 外观模式的优缺点

优点:

  • 简化接口 📦!
  • 降低耦合度 🔗!
  • 提高灵活性 🤸!
  • 提高安全性 🔒!

缺点:

  • 不能很好地限制客户使用子系统类,如果客户知道子系统类,还是可以直接使用 😫!
  • 不符合开闭原则,如果需要增加新的子系统,需要修改外观类 😫!

五、 外观模式的应用场景

  • 当你要为一个复杂子系统提供一个简单接口时: 就像"一键烹饪包" 🍲!
  • 当客户程序与多个子系统之间存在很大的依赖性时: 就像客户端需要直接操作各种食材和烹饪步骤 🥕🍄🍖🔪🔥!
  • 当你需要构建一个层次结构的子系统时,使用外观模式定义子系统中每层的入口点: 就像为不同的用户提供不同的烹饪方法 👨‍🍳!
  • 编译器: 编译器可以将复杂的编译过程封装起来,对外提供一个简单的编译接口。

六、 总结

  • 外观模式就像提供一个"傻瓜式"的操作界面,隐藏复杂的内部逻辑! 📦
  • 主要包含外观类和子系统两个角色! 🎭
  • 优点是简化接口、降低耦合度、提高灵活性、提高安全性! 👍
  • 缺点是不能很好地限制客户使用子系统类、不符合开闭原则! 👎
  • 适用于需要简化复杂系统的使用,或者需要降低子系统之间耦合度的场景! 🎯

希望这个例子能让你更容易理解外观模式! 💯 祝你学习愉快! 😄

看完请看:(十 一)趣学设计模式 之 组合模式!

相关推荐
八股文领域大手子3 小时前
JVM垃圾回收器深度底层原理分析与知识体系构建
java·jvm·算法
虾球xz3 小时前
游戏引擎学习第124天
java·学习·游戏引擎
赤水无泪4 小时前
结构型模式---外观模式
外观模式
计算机毕设定制辅导-无忧学长4 小时前
Maven 生命周期与构建命令(一)
java·maven
老朋友此林4 小时前
浅析 Redis 分片集群 Cluster 原理、手动搭建、动态伸缩集群、故障转移
java·数据库·redis
CodeCaster5 小时前
他来了,为大模型量身定制的响应式编程范式(1) —— 从接入 DeepSeek 开始吧
java·ai·langchain
千里码!5 小时前
java23种设计模式-观察者模式
观察者模式·设计模式
IT学长编程5 小时前
计算机毕业设计 基于SpringBoot的智慧社区管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·后端·毕业设计·课程设计·论文笔记·1024程序员节
hadage2335 小时前
--- spring MVC ---
java·spring·mvc