如果只看代码的话,应该可以说Facade pattern(门面设计模式)是一种最简单的代码结构,不就封装吗!这玩意谁不会!

还是看它背后所蕴含的思想吧,看了之后发现背后的思想也很简单,非常好理解。 - -。

Think

Encapsulation:

在物理世界中,从古代的弹药子弹的发展其实就是对弹药的封装,因此大大提高了装弹效率。经过演化,发现一次装一发子弹还是不够高效,如果再进一步,在子弹外再封装一层弹夹的话则会更显著地提升效率。

在Java编程中,一对大括号{ }就是类、方法等结构的外壳、边界,它能很好地把类的各种属性及行为包裹起来,将它们封装在类内部并固化成一个整体。封装好的类如同一个黑匣子,外部无法看到内部的构造及运转机制,而只能访问其暴露出来的属性或方法。

门面设计模式:

本质上来讲,它和封装的含义是一样的,无非是一般概念里的封装只是针对同一个类内的属性,方法进行封装,这里的封装更泛一些,能包含更广泛的子系统的方法。

门面设计模式可以隐藏系统的内部复杂性,提供一个简化的操作接口,使得客户端更容易使用系统。

该模式通过提供一个高层次的接口,将一个或多个子系统的复杂操作封装起来,使得客户端只需要与门面对象进行交互,而不需要直接与子系统的各个组件进行通信。这样可以减少客户端与子系统之间的耦合,降低了系统的复杂性,同时提供了一种简洁、统一的界面。

Example - 音响系统

假设我们有一个音响系统,包含多个子系统组件,如音频播放器、发光灯和温度控制器。我们可以创建一个音响门面类,负责封装这些子系统的复杂操作,并提供一个简单的接口供客户端使用。

// 子系统组件 - 音频播放器
class AudioPlayer {
public void play() {
System.out.println("播放音频");
}
} // 子系统组件 - 发光灯
class Light {
public void turnOn() {
System.out.println("打开发光灯");
}
} // 子系统组件 - 温度控制器
class TemperatureController {
public void setTemperature(int temperature) {
System.out.println("设置温度为:" + temperature + "℃");
}
} // 音响门面类
class StereoFacade {
private AudioPlayer audioPlayer;
private Light light;
private TemperatureController temperatureController; public StereoFacade() {
audioPlayer = new AudioPlayer();
light = new Light();
temperatureController = new TemperatureController();
} // 提供简化的接口
public void startMusic() {
audioPlayer.play();
light.turnOn();
temperatureController.setTemperature(25);
System.out.println("音乐系统已启动");
}
} // 客户端代码
public class Main {
public static void main(String[] args) {
StereoFacade stereo = new StereoFacade();
stereo.startMusic();
}
}

在上述代码中,StereoFacade类充当门面类,它封装了音频播放器、发光灯和温度控制器的复杂操作。客户端代码只需要与StereoFacade交互,通过调用startMusic方法,即可启动音响系统,而无需关心底层子系统的具体实现细节

通过门面模式,客户端代码与子系统之间的耦合度得到降低,系统的复杂性得到简化,同时提供了一个简单、统一的接口,便于客户端的使用。

Facade Pattern and Encapsulation—— Structure Class的更多相关文章

  1. C#设计模式之十外观模式(Facade Pattern)【结构型】

    一.引言 快12点半了,要开始今天的写作了.很快,转眼设计模式已经写了十个了,今天我们要讲[结构型]设计模式的第五个模式,该模式是[外观模式],英文名称是:Facade Pattern.我们先从名字上 ...

  2. 外观模式Facade pattern

    http://www.runoob.com/design-pattern/facade-pattern.html 外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一 ...

  3. 设计模式(八): 从“小弟”中来类比"外观模式"(Facade Pattern)

    在此先容我拿“小弟”这个词来扯一下淡.什么是小弟呢,所谓小弟就是可以帮你做一些琐碎的事情,在此我们就拿“小弟”来类比“外观模式”.在上面一篇博文我们完整的介绍了“适配器模式”,接下来我们将要在这篇博客 ...

  4. 深入浅出设计模式——外观模式(Facade Pattern)

    模式动机引入外观角色之后,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度. 模式定义外观模式(Facade Pattern):外部与一个子系统的通信必 ...

  5. 二十四种设计模式:外观模式(Facade Pattern)

    外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.示例有一个Message实体类,某对象对它 ...

  6. 乐在其中设计模式(C#) - 外观模式(Facade Pattern)

    原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...

  7. 使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)

    本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲, 想插入到欧洲标准的墙壁插座里面, 就需要用中间这个电源适配器. 面向对象的适配器 你有 ...

  8. [Angular] Extract Implementation Details of ngrx from an Angular Application with the Facade Pattern

    Extracting away the implementation details of ngrx from your components using the facade pattern cre ...

  9. php门面模式(facade pattern)

    书上不全的代码,我自己补全的. <?php /* The facade pattern is used when we want to simplify the complexities of ...

  10. [Design Patterns] 02. Structural Patterns - Facade Pattern

    前言 参考资源 史上最全设计模式导学目录(完整版) 只把常用的五星的掌握即可. 外观模式-Facade Pattern[学习难度:★☆☆☆☆,使用频率:★★★★★] 深入浅出外观模式(一):外观模式概 ...

随机推荐

  1. Vue入门浅析

    title: vue入门浅析 author: Sun-Wind date: May 14,2022 写这篇博文的目的在于为初学vue的同学对vue有一些更进一步的了解 读这篇博文前,您应该至少安装了v ...

  2. 2013年蓝桥杯C/C++大学A组省赛真题(高斯的日记)

    题目描述: 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第 ...

  3. 代码随想录算法训练营Day40 动态规划

    代码随想录算法训练营 代码随想录算法训练营Day40 动态规划| 343. 整数拆分 96.不同的二叉搜索树 343. 整数拆分 题目链接:343. 整数拆分 给定一个正整数 n,将其拆分为至少两个正 ...

  4. JavaWeb编程面试题——Spring Boot

    引言 面试题==知识点,这里所记录的面试题并不针对于面试者,而是将这些面试题作为技能知识点来看待.不以刷题进大厂为目的,而是以学习为目的.这里的知识点会持续更新,目录也会随时进行调整. 关注公众号:编 ...

  5. 大家都说Java有三种创建线程的方式!并发编程中的惊天骗局!

    在Java中,创建线程是一项非常重要的任务.线程是一种轻量级的子进程,可以并行执行,使得程序的执行效率得到提高.Java提供了多种方式来创建线程,但许多人都认为Java有三种创建线程的方式,它们分别是 ...

  6. 沉思篇-剖析Jetpack的LiveData

    上一篇我们讲到了架构组件中的Lifecycle,由于缺少具体的运用,可能缺少直观的感受,今天我们就用Lifecycle实战一回,看看Lifecycle是怎样运用到LiveData中的. LiveDat ...

  7. 【QCustomPlot】使用方法(动态库方式)

    说明 使用 QCustomPlot 绘图库辅助开发时整理的学习笔记.同系列文章目录可见 <绘图库 QCustomPlot 学习笔记>目录.本篇介绍 QCustomPlot 的一种使用方法, ...

  8. 一文掌握Python多线程与多进程

    Python的多线程和多进程 一.简介 并发是今天计算机编程中的一项重要能力,尤其是在面对需要大量计算或I/O操作的任务时.Python 提供了多种并发的处理方式,本篇文章将深入探讨其中的两种:多线程 ...

  9. 洛谷 P4859 已经没有什么好害怕的了

    题目描述 学姐 4 了. 有 \(n\) 个糖果和 \(n\) 个药片,它们要进行一一配对.每个糖果或药片都具有互不相同的能量值,要求配对后,糖果比药片能量高的对数,比剩下的对数恰好多 \(k\),求 ...

  10. 从零开始整SpringBoot-搭建一个企业级项目

    创建Springboot项目 在企业里的项目多数是分Modules的,更多是通过物理方式隔离层之间的职责. 首先按照原有新建SpringBoot项目创建,填好相关信息后,选择Java 8其他不用选. ...