• 门面/外观模式


    一、门面模式

    1、定义

    门面模式(Facade Pattern)又称作外观模式,是指提供一个统一的接口,用来访问子系统中的一群接口,属于结构型设计模式。

    门面模式的主要特征是定义了一个高层接口,让子系统更容易使用。

    2、结构

    (1)模式的结构

    主要角色如下:

    • 外观角色(Facade):也叫作门面角色,是系统对外的统一接口。
    • 子系统角色(SubSystem):可以同时有一个或者多个 SubSystem。每一个 SubSystem都不是一个单独的类,而是一个类的集合。

    注意:子系统类中没有 Facade任何信息,即没有 Facade对象的引用。对于 SubSystem而言,Facade只是另一个客户端,处理 Facade指派的任务。

    3、优缺点

    优点:

    • 简化了调用过程,不用深入了解子系统。
    • 减少系统依赖,松耦合。
    • 更好的划分访问层次,提高安全性。
    • 遵循迪米特法则。

    缺点:

    • 当增加子系统和画展子系统行为时,可能容易带来未知危险。
    • 不符合开闭原则。
    • 某些情况下,可能违背了单一职责原则。

    4、使用场景

    • 为一个复杂的模块或者子系统提供一个简单的供外界访问的接口。
    • 希望提高子系统的相对独立性时,可以使用它。

    5、在框架源码中使用

    • Spring源码中 JDBC模块下的 JdbcUtils类,它封装了与 JDBC相关的所有操作。
    • Mybatis源码中 Congiguration类,对 JDBC中关键组件的封装。

    二、模式的通用实现

    代码如下:

    public class FacadePattern {
    	public static void main(String[] args) {
    		ServiceFacade serviceFacade = new ServiceFacade();
    		serviceFacade.doCommon();
    	}
    }
    
    // 子系统角色
    class SubSystemA {
    	public void doA() {
    		System.out.println("doing A");
    	}
    }
    
    class SubSystemB {
    	public void doB() {
    		System.out.println("doing B");
    	}
    }
    
    // 外观角色
    class ServiceFacade {
    	private SubSystemA subSystemA;
    	private SubSystemB subSystemB;
    
    	public ServiceFacade() {
    		this.subSystemA = new SubSystemA();
    		this.subSystemB = new SubSystemB();
    	}
    
    	// 对外接口
    	public void doCommon() {
    		subSystemA.doA();
    		subSystemB.doB();
    	}
    }
    
    • 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
    • 34
    • 35
    • 36

    三、模式的应用实例

    以客户通过购买基金(门面)从而获得收益为例。基金经理人操作股票(子系统)交易。

    (1)股票(子系统)

    public class Stock1 {
        private String name = "股票1";
    
        public void buy(){
            System.out.println("买进" + name);
        }
    
        public void sell(){
            System.out.println("卖出" + name);
        }
    }
    
    public class Stock2 {
        private String name = "股票2";
    
        public void buy(){
            System.out.println("买进" + name);
        }
    
        public void sell(){
            System.out.println("卖出" + name);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    (2)基金(门面)

    public class FundFacade {
        private String name = "基金A";
    
        private Stock1 stock1;
        private Stock2 stock2;
    
        public FundFacade() {
            this.stock1 = new Stock1();
            this.stock2 = new Stock2();
        }
    
        public void buyFund(){
            System.out.println("买进" + name + ", 基金经理买进的股票如下:");
            stock1.buy();
            stock2.buy();
        }
    
        public void sellFund(){
            System.out.println("卖出" + name+ ", 基金经理卖出的股票如下:");
            stock1.sell();
            stock2.sell();
            System.out.println("收益1W+");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    (3)测试:小白购买该基金

    	public static void main(String[] args) {
    		FundFacade fundFacade = new FundFacade();
    		fundFacade.buyFund();
    		System.out.println("----第N天之后----");
    		fundFacade.sellFund();
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    – 求知若饥,虚心若愚。

  • 相关阅读:
    为什么要权值初始化
    【万字详解】JavaScript算法 | 力扣经典题~收藏起来,面试用得上
    【Java刷题进阶】基础入门篇⑩
    JVM-字节码
    定时器浅析
    SpringBoot_第六章(知识点总结)
    Android Button#background 在MaterialComponents主题下无效问题
    kibana查看和展示es数据(index pattern、discover、dashboard)
    【软件测试】测试人,被裁后已失业大半年该如何破局?
    opencv改变像素点的颜色---------c++
  • 原文地址:https://blog.csdn.net/qq_42402854/article/details/128139980