什么是最少知识原则?-外观模式

news2024/11/18 13:46:39

外观模式将一个或数个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外观。

构建自己的家庭影院

//打开爆米花机,开始爆米花
popper.on();
popper.pop();

//调整灯光亮度
lights.dim(10);

//把屏幕放下
screen.down();

//打开投影仪
projector.on();
projector.setInput(dvd);
projector.wideScreenMode();


//打开对应功效
amp.on();
amp.setDvd(dvd);
amp.setSurroundSound();
amp.setVolume(5);

//打开DVD播放机
dvd.on();
dvd.play(movie);

以上是看电影的任务,写成对应的类和方法的调用,如何解决这混乱的现象?可以使用外观模式。

通过实现一个提供更合理的接口的外观类,你可以将一个复杂的子系统变得容易使用。如果你需要复杂子系统的强大威力,还是可以使用原来的复杂接口;如果需要的是一个方便使用的接口,那就使用外观。

定义外观模式

创建一个接口简化而统一的类,用来包装子系统中一个或多个复杂的类。外观模式允许我们让客户和子系统之间避免紧耦合。

外观模式 提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

image

"最少知识"原则

最少知识原则:只和你的密友谈话。

这个原则希望我们在设计中,不要让太多的类耦合在一起,免得修改系统中一部分,会影响到其他部分。如果许多类之间相互依赖,那么这个系统就会变成一个易碎的系统,它需要花许多成本维护,也会因为太复杂而不容易被其他人了解。

不要影响太多对象

就任何对象而言,在该对象的方法内,我们之应该调用属于以下范围的方法:

  1. 该对象本身。
  2. 被当作方法的参数而传递进来的对象。
  3. 次方法所创建或实例化的任何对象。
  4. 对象的任何组件。

对以上的总结:如果某对象是调用其他方法的返回结果,不要调用该对象的方法。

//从气象站取得温度计,然后再从温度计对象获取温度(不推荐)
public float getTemp(){
    Thermometer thermometer = station.getThermometer();
    return thermometer.getTemperature();
}

//应用最少知识原则,在气象站加入一个方法,用来向温度计请求温度。这样可以减少我们所依赖的类的数目
public float getTemp(){
    return station.getTemperature();
}

将方法调用保持在界限内

以下汽车类,展示调用方法的各种做饭,同时遵守最少知识原则

/**
 * @ClassName Car
 * @Author jia_xx
 * @Date 2023/1/14 21:25
 */
public class Car {
    //实例变量
    //类的组件,可以调用它的方法
    Engine engine;
    
    public Car(){
        //初始化发动机
    }
    
    public void start(Key key){
        Doors doors = new Doors();
        
        //参数传递进来的对象,其方法可以调用
        boolean authorized = key.turns();
        
        if(authorized){
            //组件方法,可以调用
            engine.start();
            //同一个对象的本地方法,可以调用(local method)
            updateDashboardDisplay();
            //可以调用创建或实例化的对象方法
            doors.lock();
        }
    }
    
    public void updateDashboardDisplay(){
        //更新展示
    }
}

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

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

相关文章

【阶段三】Python机器学习32篇:机器学习项目实战:关联分析的基本概念和Apriori算法的数学演示

本篇的思维导图: 关联分析模型:Apriori算法 关联分析的基本概念和Apriori算法 关联分析是数据挖掘中一种简单而实用的技术,它通过深入分析数据集,寻找事物间的关联性,挖掘频繁出现的组合,并描述组合内对象同时出现的模式和规律。例如,对超市购物的数据进行关联…

缓存Cache-Control

可缓存性指定哪些地方可以缓存publichttp请求返回的过程中,http请求返回的内容所经过的任何路径包括:中间的代理服务器,发出请求的客户端浏览器,都可以对返回的内容进行缓存。private发起请求的浏览器可以缓存。no-cache任何节点都…

【程序员高效率工具】PlantUML —— 使用代码快速绘制时序图、思维导图

本篇思维导图 前言 不管是在工作还是学习,特别是在项目计划初期,我们需要画大量的图将工作内容、项目方案等进行可视化描述,包括但不限于时序图、类图、思维导图等等。 但是对于不经常画图,或者经常使用键盘的孩子,手…

VMware三种网络模式的摸索

VMware三种网络模式的摸索 文章目录VMware三种网络模式的摸索前言一、桥接模式简要描述拓扑图展示配置测试优缺点二、NAT模式简要描述拓扑图展示配置测试优缺点三、仅主机模式简要描述拓扑图展示配置测试优缺点3.总结前言 注意:所有的测试请关闭虚拟机和主机的防火…

微信小程序 - 实现手机号登录--授权并获取手机号保存至本地

详细代码请见文档最下方,仅供参考,更多需要请查看官方文档 一、 微信官方文档 | 获取手机号 这是服务端的 这是我们前端获取手机号需要给接口传递的两个参数 注意: 参数一:获取access_token需要用到小程序密钥,这个…

你可能不知道的20个Git命令,但真的很实用

如果您曾经浏览过git 手册(或 run man git),那么您会注意到 git 的功能比我们大多数人每天使用的要多得多。很多这些命令都非常强大,可以让你的生活更轻松(其他命令有点小众,但仍然很高兴知道)。…

QT-QStackedWidget多窗口应用

前言: 多窗口应用,例如某微信,页面由1,2,3个布局组成。 1-基本流程 页面1控制页面2,通过选择页面1上的按钮或控件 页面2控制页面3,通过选择页面2上的按钮或控件 2-其中页面2中的页面很…

100、【树与二叉树】leetcode ——105. 从前序与中序遍历序列构造二叉树+106. 从中序与后序遍历序列构造二叉树(C++版本)

106. 从中序与后序遍历序列构造二叉树 题目描述 原题链接:106. 从中序与后序遍历序列构造二叉树 解题思路 中序的特点:左中右,后序的特点:左右中。因此可通过后序序列找到中间结点,然后再根据中间结点,分…

3、关键词与标识符

目录 一、关键词 二、标识符 一、关键词 C语言中有32个关键字: 注意:在C语言中,关键字是不允许作为标识符出现在程序中的。 二、标识符 C语言标识符的命名规则: (1)所有标识符必须由字母或下画线开头…

KMP算法 看这一篇就够了 图解刨析+代码

目录 问题背景 逐步剖析 KMP如何优化暴力做法 思考 公共前后缀 next数组 如何构建next数组: 代码实现 问题背景 给定一个字符串 S,以及一个模式串P, P 在字符串 S 中多次作为子串出现。 求出模式串 P 在字符串 S 中所有出现的位置的起始下标。 …

说话人识别中的Temporal pooling(时序池化)

概述 Temporal pooling(时序池化)是说话人识别神经网络中,声学特征经过frame-level变换之后,紧接着会进入的一个layer。目的是将维度为(bs,F,T)(bs,F,T)(bs,F,T)的特征图,变换成维度为(bs,F)(bs,F)(bs,F)的特征向量 …

再不来看看常用的PyCharm快捷键就out了,玩转PyCharm仅此一篇!

最近在学习Python的数据可视化项目,在大学有学过Python,还有一些基础的。目前虽说已经工作,但是兴趣使然,依然想在空闲时间学一些其他技能来充实自己,未雨绸缪! 在使用工具的时候,必定会对工具有…

【话题:工作生活】2021年工作总结--这些人,那些事。

Hello Everyone, 我又开始撰写自己的工作总结了。2021年的工作总结,拖得太久,拖得我也不想写了。每次写自己一年的工作总结,总是要耗费我大量的时间与心力,有时,我也真的是心好累。 好了,懒散、…

【人工智能原理自学】隐藏层:神经网络为什么Working

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔笔记来自B站UP主Ele实验室的《小白也能听懂的人工智能原理》。 🔔本文讲解隐藏层:神经网络为什么Working,一起卷起来叭! 目录一、…

深度学习 11 梯度下降算法改进

数据初始化要点: 1. 梯度下降算法的三种方式: 批量梯度下降法(batch),即同时处理整个训练集.小批量梯度下降法(Mini-Batch )每次同时处理固定大小的数据集.随机梯度下降法(stochastic gradient descent), 每次随机选…

acwing基础课——约数

由数据范围反推算法复杂度以及算法内容 - AcWing 常用代码模板4——数学知识 - AcWing 基本思想: 首先,约数,又称因数。整数a除以整数b(b≠0)除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的…

怎样才能过好这一生?

文章目录1. 日拱一卒,功不唐捐1.1 适当的时候给自己一个奖励1.2 一个人可能走的更快,但一群人才能走的更远1.3 通过一些事情去逼自己一把1.4 从真理中去感悟1.5 当你面临绝路时2. 梦想的意义不在于实现3. 孤独4. 烦恼5. 别总说来日方长6. 忍和韧性7. 事情…

【linux kernel】linux内核重要函数 | do_initcalls

文章目录一、导读二、do_initcalls三、构造section并添加函数(3-1)构造初始化调用section(3-2)向section中添加函数四、总结一、导读 在linux内核启动过程中,会向终端打印出很多的日志信息,从这些日志信息…

c++开源协程库libgo介绍及使用

协程这个概念,最近这几年可是相当地流行了。尤其 go 语言问世之后,内置的协程特性,完全屏蔽了操作系统线程的复杂细节。甚至使 go 开发者“只知有协程,不知有线程”了。当然 C也有高性能的协程库,比如我了解到的微信的…

基于微信小程序的企业职工薪资查询系统小程序

文末联系获取源码 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏览器…