• Java设计模式之外观模式


    1. 外观模式

    生活中,我们买菜要去菜市场,买水果要去水果店,买零食要去零食店。这需要去很多地方。这时超市(外观模式)出现了,在超市里你可以买到菜、水果、零食

    1.1 定义、优缺点、适用场景

    定义:外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个统一的接口。客户端不用关心内部子系统的具体细节,内部子系统的改变而不影响客户端。这样会大大降低应用程序的耦合度,提高了程序的可维护性

    外观模式是迪米特法则的典型应用,优点如下:

    • 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户端
    • 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易
    • 降低了大型软件系统中的编译依赖性,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象

    缺点

    • 不能很好地限制客户使用子系统类,很容易带来未知风险
    • 增加新的子系统可能需要修改外观类,违背了“开闭原则”

    适用场景

    • 对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系
    • 当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问
    • 当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性

    1.2 模式的结构与实现

    结构

    • 外观(Facade)角色:为多个子系统对外提供一个共同的接口
    • 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它
    • 客户(Client)角色:通过一个外观角色访问各个子系统的功能

    实现

    public class FacadeTest {
    
        public static void main(String[] args) {
            SuperMarket superMarket = new SuperMarket();
            superMarket.buyGood();
        }
    }
    
    
    // 外观角色: 超市
    class SuperMarket {
        private VegetableArea vegetableArea = new VegetableArea();
        private FruitArea fruitArea = new FruitArea();
    
        public void buyGood() {
            vegetableArea.buyVegetable();
            fruitArea.buyFruit();
        }
    }
    
    // 子系统角色:买菜区域
    class VegetableArea {
        public void buyVegetable() {
            System.out.println("在买菜区域买菜");
        }
    }
    
    // 子系统角色:水果区域
    class FruitArea {
        public void buyFruit() {
            System.out.println("在水果区域买水果");
        }
    }
    
    • 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

    运行程序,结果如下:

    在买菜区域买菜
    在水果区域买水果
    
    • 1
    • 2
  • 相关阅读:
    写个rpc调用,试试自己了解多少
    【VSCode + Anaconda】VSCode [WinError 126]找不到指定模块
    Java&Vue 借助json传递数据
    亚马逊频繁扫号下的跨境电商,跨境电商卖家应该何去何从?
    MATLAB算法实战应用案例精讲-【智能优化算法】算术优化算法-AOA(附matlab代码)
    介绍 TensorFlow 的基本概念和使用场景。
    Java随笔-继承
    鼎医信息加入PolarDB开源数据库社区
    解决docker开启MySQL的binlog无法成功。docker内部报错:mysql: [ERROR] unknown variable
    mysql之DML的select分组排序
  • 原文地址:https://blog.csdn.net/yy8623977/article/details/125769548