设计模式学习——外观模式

瑞萨MCU定时器API实战:从Smart Configurator配置到中断与输入捕获应用 在嵌入式系统开发中,定时器(Timer)是实现精准时序控制、PWM输出和信号测量的核心硬件外设。其工作原理基于计数器在稳定时钟源驱动下递增或递减,达到预设值后触发中断或改变输出电平,从而为系统提供节拍和事件基准。通过图形化配置工具(如瑞萨的Smart Configurator),开发者可以高效地将复杂的硬件寄存器操作转化为清晰、标准化的C语言API函数,这极大地提升了开发效率并降低了出错风险。这种从硬件抽象到软件接口的技术价值在于,它使得开发者能更专注于应用逻辑,而非底层细节,尤其适用于工业控制、汽车电子等 阅读详情



基本介绍

  1. 外观模式(Facade),也叫"过程模式",外观模式为子系统中的一组接口提供了一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
  2. 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。

原理类图

在这里插入图片描述
说明(外观模式的角色分析):

  1. 外观类(Facade):为调用端提供统一的调用接口,外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当的子系统对象。
  2. 调用者(Client):外观接口的调用者
  3. 子系统的集合:指的是模块或者子系统,处理Facade对象指派的任务,它是功能的实际提供者。

代码实例

DVDPlayer (子系统之一)

public class DVDPlayer {

    //使用单例模式,使用饿汉式
    private DVDPlayer() {
    }

    private static DVDPlayer dvdPlayer = new DVDPlayer();

    public static DVDPlayer getDvdPlayer() {
        return dvdPlayer;
    }

    public void on(){
        System.out.println(" dvd on ");
    }

    public void off(){
        System.out.println(" dvd off ");
    }

    public void play(){
        System.out.println(" dvd is playing ");
    }

    public void pause(){
        System.out.println(" dvd pause");
    }

    //...
}

Popcorn (子系统)

public class Popcorn {

    private Popcorn() {}

    private static Popcorn popcorn = null;

    static {
        popcorn = new Popcorn();
    }

    public static Popcorn getPopcorn() {
        return popcorn;
    }

    public void on(){
        System.out.println(" popcorn on ");
    }

    public void off(){
        System.out.println(" popcorn off ");
    }

    public void pop(){
        System.out.println(" popcorn is pop ");
    }
}

Projector (子系统)

public class Projector {

    private Projector() {}

    private static Projector projector = null;

    static {
        projector = new Projector();
    }

    public static Projector getProjector() {
        return projector;
    }

    public void on(){
        System.out.println(" Projector on ");
    }

    public void off(){
        System.out.println(" Projector off ");
    }

    public void focus(){
        System.out.println(" Projector is focus ");
    } }

Screen (子系统)

public class Screen {

    private Screen() {}

    private static Screen screen = null;

    static {
        screen = new Screen();
    }

    public static Screen getScreen() {
        return screen;
    }

    public void up(){
        System.out.println(" Screen up ");
    }

    public void down(){
        System.out.println(" Screen down ");
    }

}

Stereo (子系统)

public class Stereo {

    private Stereo() {}

    private static Stereo stereo = null;

    static {
        stereo = new Stereo();
    }

    public static Stereo getStereo() {
        return stereo;
    }

    public void on() {
        System.out.println(" Stereo on ");
    }

    public void off() {
        System.out.println(" Stereo off ");
    }

    public void up() {
        System.out.println(" Stereo up.. ");
    }

}

TheaterLight (子系统)

public class TheaterLight {

    private TheaterLight() {}

    private static TheaterLight theaterLight = null;

    static {
        theaterLight = new TheaterLight();
    }

    public static TheaterLight getTheaterLight() {
        return theaterLight;
    }

    public void on() {
        System.out.println(" TheaterLight on ");
    }

    public void off() {
        System.out.println(" TheaterLight off ");
    }

    public void dim() {
        System.out.println(" TheaterLight dim.. ");
    }

    public void bright() {
        System.out.println(" TheaterLight bright.. ");
    }
}

HomeTheaterFacade (Facade,外观模式)

public class HomeTheaterFacade {

    //定义各个子系统对象
    private TheaterLight theaterLight;
    private Popcorn popcorn;
    private Stereo stereo;
    private Projector projector;
    private Screen screen;
    private DVDPlayer dvdPlayer;

    public HomeTheaterFacade() {
        this.theaterLight = TheaterLight.getTheaterLight();
        this.popcorn = Popcorn.getPopcorn();
        this.stereo = Stereo.getStereo();
        this.projector = Projector.getProjector();
        this.screen = Screen.getScreen();
        this.dvdPlayer = DVDPlayer.getDvdPlayer();
    }

    //操作分成4步
    public void ready() {
        popcorn.on();
        popcorn.pop();
        screen.down();
        projector.on();
        stereo.on();
        dvdPlayer.on();
        theaterLight.dim();
    }

    public void play() {
        dvdPlayer.play();
    }

    public void pause() {
        dvdPlayer.pause();
    }

    public void end() {
        popcorn.off();
        theaterLight.bright();
        screen.up();
        projector.off();
        stereo.off();
        dvdPlayer.off();
    }

}
 

测试用例

public static void main(String[] args) {
        HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();
        homeTheaterFacade.ready();
        homeTheaterFacade.play();
        homeTheaterFacade.pause();
        homeTheaterFacade.end();
    }

外观模式在MyBatis框架的源码分析

MyBatis中的Configuration去创建MetaObject对象使用到外观模式

编写测试用例,引入mybatis的jar包(在pom文件中引入),点击Configuration

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

源码类图

在这里插入图片描述


外观模式的注意事项和细节

  1. 外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性。
  2. 外观模式对客户端与子系统的耦合关系,让子系统内部的模块更易维护和扩展
  3. 通过合理的使用外观模式,可以帮我们更好的划分访问的层次。
  4. 当系统需要进行分层设计时,可以考虑使用Facade模式。
  5. 在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个Facede类,来提供遗留系统的比较清晰简单的接口,让新系统与Facade类交互,提高复用性。
  6. 不能过多的或者不合理的使用外观模式,使用外观模式号,还是直接调用模块好,要以系统有层次,利于维护为目的。
MIKE水动力笔记1_岸线及水深数据之依靠全球数据库资源提取的方法 通过各种数据库资源来获取全球岸线及水深数据,这种方法获取的岸线及水深数据精度偏低,比较适合大尺度范围的水动力研究。 阅读详情

相关推荐

SDU CS 期末考回忆版合集

删除原有分散的版本,合订起来画个。包括:机器学习、算法、图形学、操作系统、编译原理、软件工程、大数据分析管理、计算机体系结构等。

https://github.com/ZhaoyungZhang 6648

设计模式之外观模式(附:MyBatis中Configuration的外观模式的使用分析)

一、概述 1、定义         Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use.(要求一个系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式提供一个高层次的接口,使得子系统更容

qq_42339210的博客 487

ESP32连接OneNet云平台实现多设备联动控制完整示例

通过esp32连接onenet云平台,实现远程设备间的智能联动控制,利用MQTT协议完成数据通信,esp32连接onenet云平台后可高效稳定地上传与下发指令,提升物联网系统响应速度与自动化水平。

weixin_42360733的博客 547

外观模式---寄信

Iletterprocess.java package PostCard; public interface Iletterprocess { public void writecontext(String context); public void fillenvelope(String address); public void letterintoenve...

文天哥哥的博客 975

Proteus下载安装快速入门:30分钟掌握全过程

手把手教你完成proteus下载安装,从环境配置到首次运行一气呵成,适合电子设计新手快速掌握仿真工具的核心操作步骤。

weixin_31974443的博客 891

OpenMontage:AI代理驱动的端到端视频生产系统实战指南

在当今内容创作领域,自动化视频生成技术正成为提升生产效率的关键。其核心原理在于通过智能体(Agent)架构,将复杂的视频制作流程拆解为可被AI理解和执行的标准化任务,从而实现从创意到成片的端到端自动化。这项技术的核心价值在于大幅降低了专业视频制作的门槛,使非专业用户也能快速产出具有一定专业度的内容。其典型应用场景包括社交媒体短片、产品演示、知识科普视频的批量生产。OpenMontage正是这一技术理念的杰出实践,它构建了一个完整的代理驱动视频生产系统,将AI编码助手转变为能自主规划并执行脚本撰写、素材检索、

weixin_35757191的博客 648

设计模式(十一)——外观模式(Facade Pattern)

外观模式(Facade Pattern) 基本介绍 外观模式(Facade),也叫“过程模式,为子系统中的一组接口提供一个一致的入口,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(封装子系统的复杂性,便于客户端调用)。 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。 外观模式的UML类图 角色分析 ...

Duktig的博客 428

YOLOv9电力巡检实战:绝缘子破裂/鸟巢识别+无人机自动定位

摘要:本文聚焦电力输电线路巡检的效率与安全痛点,提出基于YOLOv9与无人机的智能巡检解决方案。针对绝缘子破裂、鸟巢等高危缺陷,通过“无人机改装-模型训练-缺陷识别-工单生成”四阶段工程落地流程,实现全自动化巡检。系统采用大疆M300无人机搭载RTK模块与Jetson边缘计算盒,结合改进YOLOv9模型实时识别5类缺陷,通过4G传输将GPS定位与缺陷数据同步至工单系统。实测表明,该方案巡检效率达50公里/天(较人工提升10倍),缺陷发现率95%(提升40%),事故预防率98%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1510

结合Mybatis源码看设计模式——外观模式

定义   提供了一个统一的接口,用来访问子系统中一群接口 适用场景 子系统复杂,增加外观模式提供简单调用接口 构建多层系统结构,用外观对象作为每层入口 详解   外观模式,主要理解外观。通俗一点可以认为这个模式是将子系统封装到一起,提供给应用的层面就提供一个方法。不直接由应用层直接访问子系统。   下面我们看看ibatis的源码来具体理解外观模式。 publi...

weixin_34291004的博客 286

117、HDR多帧融合算法:曝光序列、运动鬼影消除与合成权重的高效实现

HDR多帧融合算法实战经验总结 本文分享了HDR多帧融合算法在实际应用中的关键技术和优化经验。主要内容包括: 曝光序列设计:强调动态调整曝光时间比、帧间间隔和拍摄顺序的重要性,特别指出短-中-长的拍摄顺序优势。 运动鬼影消除:比较了三种运动检测方法,推荐梯度域检测方案,并强调在RAW域进行检测的必要性。 合成权重设计:提出基于高斯型权重函数的多因素考量方法,包括基础权重、运动权重和噪声权重的综合处理策略。 高效实现方案:提供NEON指令集加速的具体代码示例,包括梯度计算、权重查表和融合处理等关键步骤。 实用

zzfmlxs的博客 65

2026华为OD面试题029:勇攀数字高峰

在给定的数字地形图里寻找登山路径,数字代表当前位置的海拔高度。要求从最低海拔出发,不断攀登,最终到达最高山峰。地图保证最低海拔和最高山峰都只有一个。 登山规则: - 路径上的海拔必须严格递增 - 只能向上下左右 4 个方向移动 - 路径必须从最低海拔开始,到最高海拔结束 - 每个地点只能走一次 - 每一步的攀登高度差必须大于 0,且不超过指定值 `K` 输出满足条件的登山路径的数量。

琅嬛福地 116

设计模式 | 外观模式及典型应用

前言 本文的主要内容: 介绍外观模式 示例 自己泡茶 到茶馆喝茶 外观模式总结 外观模式的典型应用 spring JDBC 中的外观模式 Mybatis中的外观模式 Tomcat 中的外观模式 SLF4J 中的外观模式 外观模式 外观模式是一种使用频率非常高的结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户...

weixin_34416649的博客 1095

车载以太网测试-3【Wireshark介绍】

数据包捕获支持从多种网络接口(如以太网、Wi-Fi、蓝牙等)捕获数据包。可以实时捕获或从文件中读取已捕获的数据包。协议解析支持解析数百种网络协议(如 TCP/IP、HTTP、DNS、FTP 等)。能够深入解析协议头部和负载,帮助用户理解网络通信的细节。过滤功能提供强大的显示过滤器和捕获过滤器,帮助用户快速定位和分析感兴趣的数据包。支持基于协议、IP地址、端口号等多种条件的过滤。统计和分析提供多种统计工具,如流量图、会话统计、协议分层统计等。

车载网络测试工程师的博客 1989

设计模式学习—外观模式(Facade Design Pattern)

一、我的理解 外观模式就像银行柜台的接待员,汇款、存款等操作在后台运行着很复杂的业务逻辑,但是通过接待员,他将后台的这种种复杂的业务逻辑简化为一个个对外的简单方法,比如你说一句“汇款”,调用他的汇款接口,输入相应参数后,他会自己去调用相关业务实现这一功能。相当于向外屏蔽了内部的种种复杂情形。 二、Java实例 其中Shape接口便于统一调用,真正实现外观模式的类是ShapeM

闲鱼的博客 727

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

认真学习设计模式之外观模式(Facade Pattern)

# 【1】概述 `外观模式(Facade),也叫“过程模式`:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。 **UML原理图** ![在这里插入图片描述](https://img-blog.csdnimg.cn/997a1e5d30e64fd0b3693875754e468e.png) **对类图说明(分类外观

小小默:进无止境 1323

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java设计模式学习—外观模式(Facade Pattern)

java设计模式-外观设计模式

m0_37742889的博客 312

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

学习设计模式《二》——外观模式

外观模式的本质是【封装交互、简化调用】

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1090

设计模式学习笔记十三:外观模式(Facade Pattern)

设计模式学习笔记十三:外观模式(Facade Pattern)      1.概述      外观模式(Façade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个接口使得这个子系统更加容易使用。通过这个接口,其他系统可以方便的调用子系统中的功能,而忽略子系统内部发生的变化。      外观模式(Façade)是经常使用的模式之一,并且可以应用在任

AlbenXie的博客 724

学习设计模式-外观模式(Facade Pattern)

定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观模式定义类了一个高层接口,让子系统更容易使用。 介绍 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。 何时使用: 1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一...

提莫达达的博客 241

设计模式学习--14.外观模式(Facade Pattern)

package com.designepattern.facadepattern; /** * @Date:2020/12/2 * @Content: */ /*** * 1.外观模式、门面模式 * 问题:仅仅是类的迭加使用吗? */ public class MainDemo { public static void main(String[] args) { Facade f=new Facade(); f.facadeMet...

u010031813的博客 127

设计模式学习--适配器模式(Adapter Pattern)+外观模式(Facade Pattern)

amp.off();各个子系统类的实现} else {} else {");可以观赏电影啦测试效果:好,关于适配器模式和外观模式就记录到这里,接下来会继续学习新的设计模式:模板方法模式。

m0_74931167的博客 331

HeadFirst 设计模式学习笔记7--适配器模式和外观模式

本文已搬家至【HeadFirst 设计模式学习笔记】7 适配器模式和外观模式

gnuhpc的专栏 2421
上一篇: Java多线程编程学习——01线程的创建方式和生命周期
下一篇: Java多线程编程学习——02线程安全问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值