门面/外观模式

news2024/11/24 18:56:37

一、门面模式

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)股票(子系统)

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);
    }
}

(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+");
    }
}

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

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

在这里插入图片描述

– 求知若饥,虚心若愚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/53377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP基于thinkphp的网上图书管理系统#毕业设计

本论文主要论述了如何使用php语言开发一个网上图书管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,面向对象编程思想进行项目开发。在引言中,将论述网上图书管理系统的当前背景以及系统开发的目的,后续章节将严格按照软…

基于PHP+MySQL协同办公系统的设计与实现

随着全球经济一体化进程的加快和信息技术的飞速发展,Internet技术及其应用给人们的日常生活和工作等各个方面带来了深刻的影响。网络应用技术的不断提高,企业对于相互之间的通讯能力提出了更高的要求。许多企业都具有一定信息化基础,有一定数…

HTML文本溢出处理

有时在做某些需求布局时,需要处理文本溢出时的情况,如果不处理可能会重新重叠的效果,关于设置文本溢出,主要就是多行/单行的处理,代码如下 1.处理单行文本溢出 /* 设置文本溢出时的处理模式 */text-overflow:ellipsis;overflow: hidden;white-space: nowrap; 2.处理多行文本溢出…

视频播放 (三) 视频列表

1. 配置信息 1.1 AndroidManifest.xml 添加网络权限 <uses-permission android:name"android.permission.INTERNET" /> 1.2 使用 Http 明文设置 android:usesCleartextTraffic"true" 1.3 使用竖屏设置 android:screenOrientation"portrait&q…

FCP第二题:数据库中有一张地区数据统计表,但是并不规则

【题目要求】 数据库中有一张地区数据统计表,但是并不规则 ,记录类似于,225100:02:3:20160725是一串代码,以:分割,第1位为地区代码,第2位为分类代码,第3位为数量,第4位为日期 地区代码含义225100-上海 225200-江苏 225300-浙江 为可能有某些位不存在,缺位时计算规…

很多up主都在使用的Editplus,强大的编辑器-并附有编译执行配置 java编译(新款发放)

趣味拓展 邻居老李家的屋顶为什么有时漏雨&#xff0c;有时不漏雨&#xff1f; (答案在文末) 引言 不晓得你们怎么认识Editplus的&#xff0c;小编最初认识Editplus是在老杜的javaSE视频中 杜老师SE视频中也分享的有Editplus&#xff0c;不过这款是新版本~ 软件介绍 1.EditPl…

【密码加密原则】

目录 1. 什么是密码加密 2. 典型的消息摘要算法 1. 什么是密码加密 用户在使用软件时所提交的密码&#xff0c;不应该被记录下来&#xff0c;如果将用户的密码记录&#xff0c;这是不安全的做法&#xff01; 当用户提交注册信息时&#xff0c;密码必须被记录下来&#xff0…

MYSQL中AS(取别名)

文章目录0 写在前面1 格式2 举例2.1 设置表别名2.2 设置字段别名3 写在末尾0 写在前面 在做业务&#xff0c;在mybatis中手写sql中再多表查询去映射实体时&#xff0c;总会用到AS这个关键字。 或者我们在数据库大量字段测试数据时&#xff0c;很多字段都有相同的前缀&#xff…

【虹科方案】虹科数字化仪——机械测量的最佳方案!(二)

前文回顾 【虹科方案】虹科数字化仪——机械测量的最佳方案&#xff01;&#xff08;一&#xff09; 前文介绍了在对机械设备和系统进行测量时如何选择数字化仪及传感器&#xff0c;并以小型三叶片冷却风扇的基本机械测量作为案例&#xff0c;说明传感器和数字化仪如何一起使…

如何走出自动化测试第一步?

1、我想问一下关于自动化测试工具Selenium和QTP的区别。假如一个系统现在需要一款自动化测试工具&#xff0c;要求可以重复提交表单进行功能性测试&#xff0c;不用纯手工去做&#xff08;因为工作量过大&#xff09;&#xff0c;现在有两个工具&#xff08;Selenium和QTP&…

为什么说“分布式架构”才是AR眼镜的未来

近两年消费级AR眼镜得到了快速发展&#xff0c;无论是基于BB的分体式&#xff0c;还是基于光波导方案的一体机都在加快迭代&#xff0c;不断地在产品形态和软件使用体验上带来创新。然而从长期来看&#xff0c;消费级AR/VR仍处于早期阶段&#xff0c;未来有非常多的可能性。 其…

【C++】并查集

并查集这个数据结构本身并不难&#xff0c;其主要是提供一个思路&#xff0c;方便我们编写图的代码&#xff0c;和一些OJ题 文章目录1.什么是并查集&#xff1f;2.思路2.1 合并集合2.2 压缩路径3.代码4.OJ题4.1 剑指 Offer II 116. 省份数量4.2 等式方程的可满足性1.什么是并查…

高精度工厂人员定位,打造数字化智慧工厂

工厂人员定位&#xff0c;通过对工业厂区人员、物资、车辆进行精准的定位&#xff0c;实现对人员、物资、车辆的智慧管控&#xff0c;从而实现工厂安全生产管理智能化。 人工智能的推广使得工厂的生产效率不断提升&#xff0c;企业对安全生产和降本增效的需求也越来越大。高精度…

跨境电商迎来销售旺季,APS计划排产帮助企业提升生产效率

根据报道称&#xff0c;我国跨境电商的进出口规模5年来增长了近10倍&#xff0c;为了商品能够顺利“出海”&#xff0c;不少物流企业开辟了新的物流专线。 据海关统计&#xff0c;我国跨境电商进出口规模5年增长近10倍。为了保障商品顺利“出海”&#xff0c;今年&#xff0c;不…

Tableau 入门系列之各种图形绘制

文章目录What熟悉Tableau绘制各种图形柱状图 &#x1f4ca;折线图&#x1f4c8;饼图文字云气泡图热图突出显示图筛选器参考线地图制作DashboardWhat Tableau 是一个可视化分析平台&#xff0c;它改变了我们使用数据解决问题的方式&#xff0c;使个人和组织能够充分利用自己的数…

虚拟内存系统【页面置换算法】

页面置换算法&#x1f4d6;1. 最优页面置换算法(OPT)&#x1f4d6;2. 先入先出置换算法(FIFO)&#x1f4d6;3. 随机(Random)&#x1f4d6;4. 最近最少使用的置换算法(LRU)&#x1f4d6;5. 近似LRU 时钟页面置换算法&#x1f4d6;6. 最不常用算法&#x1f4d6;7. 考虑脏页在虚拟…

CleanMyMac X2022苹果电脑专业清理Mac加速器软件

CleanMyMac X2023最新免费版苹果电脑专业清理软件&#xff0c;对于Mac电脑用户来说&#xff0c;Cleanmymac X是一款再熟悉不过的电脑清理软件&#xff0c;它是由苹果认证并对外承认的一款第三方清理软件&#xff0c;几乎有95%的Mac用户都会安装并使用&#xff0c;Cleanmymac X究…

代码随想录——栈与队列

232.用栈实现队列 力扣题目链接 使用栈实现队列的下列操作&#xff1a; push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 示例: MyQueue queue new MyQueue(); queue.push(1); queu…

如何使用qemu调试内核

文件系统 调试内核需要一个基本的文件系统&#xff0c;我们可以使用简单的 ramdisk来作为这个文件系统&#xff0c;如果&#xff0c;需要测试一些其它应用程序&#xff0c;我们还需要创建一个大一点根文件系统。 Ramdisk 也就是内核启动时的initrd.img&#xff0c;可以使用b…