Java设计模式之设计原则

Java设计模式

Java设计模式主要原则是开闭原则,即对扩展开放,对修改关闭。由此衍生出5大原则:单一职责原则,里式替换原则,迪米特原则,接口隔离职责,依赖倒置原则。

1、开闭原则

开闭原则:对扩展开放,对修改关闭。一个接口,特别是底层接口或者抽象类,
从诞生后起,要尽可能少改动它,因为一旦改动,所有引用它的类或者接口都会收到影响。需要做回归测试,所有软件也需要重新测试。这会带来巨大的代价。如果知识做扩展,除了扩展新增功能需要做测试外,接口原有实现都不用改动。

单一职责原则

接口或者抽象类职责要单一,不要是很多功能的复合体。比如我有一个用户接口UserInfo,它既负责维护用户属性,也负责定义用户行为。这就违背了单一职责原则,接口的实现类那必然实现用户所有功能,后面扩展行为,或者属性势必会影响整个接口,影响面也会更大。

里式替换

简单说就是使用任意子类可以替换父类,程序依然成立,即原有输入和输出类型依然不变。

迪米特

Java class要尽可能暴露少的method,field给外部。即多使用private protected 等关键字约束访问权限。同时在编写程序时 class只和直接接触的对象有耦合,对于不直接接触的对象不要产生耦合。示例如下
场景:老师让那个体育委员清点女生人数

示例一:女生是teacher的参数

public class Teacher {
//老师对学生发布命令,清一下女生
public void commond(GroupLeader groupLeader){
List listGirls = new ArrayList();
//初始化女生
for(int i=0;i<20;i++){
listGirls.add(new Girl());
}
//告诉体育委员开始执行清查任务
groupLeader.countGirls(listGirls);
}
}

示例二:女生作为体育委员的参数

public class Client {
public static void main(String[] args) {
//产生一个女生群体
List<Girl> listGirls = new ArrayList<Girl>();
//初始化女生
for(int i=0;i<20;i++){
listGirls.add(new Girl());
}
Teacher teacher= new Teacher();
//老师发布命令
teacher.commond(new GroupLeader(listGirls));
}
}

通过示例一和二的比较,明显可以发现示例二有更好的扩展性,老师和女生无直接关系,示例二从老师的角度只知道GroupLeader类,而不需要定义Girl,不管Girl有任何变动,只需要对GroupLeader做相应调整,而teacher不用动。降低耦合,增强扩展性。

接口隔离职责

接口隔离可以看作单一性原则的再度细化,比如上面的UserInfo接口,被拆分为用户属性接口和用户行为接口,用户行为接口kennel会定义很多行为,打游戏,开车,打球,逛街。等等,这些都属于用户行为,但是过多的行为可以再次划分,让用户属性和各种独特行为结合变成特定的人,这样就实现接口隔离。示例待添加。

依赖倒置

先说明依赖正置:如下,张三会开车,因为张三有奔驰,所以方法直接传入奔驰车。

public class Client {
public static void main(String[] args) {
Driver zhangSan = new Driver();
Benz benz = new Benz();
//张三开奔驰车
zhangSan.drive(benz);
}
}

后面章三买了辆宝马,但是宝马和奔驰没关系,因此张三必须新写一个方法来实现开宝马。这种直接传入实现类的方法没有扩展性。如果方法参数是car,那么不管张三买几辆车,都能动态传入。即面向接口编程,也就是依赖倒置。
依赖倒置做到极限就是控制反转,如Spring,所有类的创建都是用一套接口,大大降低了耦合性,同时也带来了对象创建的成本开销。但由于是启动创建,因此损耗的是启动性能,而非运行性能。

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

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

相关文章

使用 ssld 提取CMS 签名并重签名

拿SpringBoard的cms签名和entitlements.xml&#xff0c;对tihook.dylib进行重签名 工具来源&#xff1a;https://github.com/eksenior/ssld

WebFuture:测试邮件发送失败

问题描述&#xff1a;测试邮件发送失败 问题分析&#xff1a; 查看报错是模拟发送邮件请将systemsettings.json中的EnabledMail设为false&#xff01; 解决方案&#xff1a; 网站根目录找到Configuration&#xff0c;如下图所示&#xff0c;将systemsettings.json中的Enabled…

LiveNVR 直播流拉转:Onvif/RTSP/RTMP/FLV/HLS 支持海康宇视天地 SDK 接入-视频广场页面集成与视频播放说明

LiveNVR直播流拉转&#xff1a;Onvif/RTSP/RTMP/FLV/HLS支持海康宇视天地SDK接入-视频广场页面集成与视频播放说明 一、视频页面集成1.1 关闭接口鉴权1.2 视频广场页面集成1.2.1 隐藏菜单栏1.2.2 隐藏播放页面分享链接 1.3 其它页面集成 二、播放分享页面集成2.1 获取 iframe 代…

12. CSS 布局与样式技巧

在前端开发中&#xff0c;CSS 是控制页面样式和布局的核心技术。本文总结了 CSS 布局中的关键概念和实用技巧&#xff0c;包括 overflow 属性、背景图片处理、精灵图技术、display 属性、浮动布局以及清除浮动的方法。 一、overflow 属性详解 overflow 属性用于控制当元素内容…

OpenCV---Canny边缘检测

一、基本概念与核心作用 Canny边缘检测是计算机视觉中最经典的边缘检测算法之一&#xff0c;由John Canny于1986年提出。其核心目标是在噪声图像中提取精确、单像素宽、连续的边缘&#xff0c;广泛应用于&#xff1a; 目标检测预处理&#xff08;如Robomaster中灯条、装甲板的…

提效-点击跳转到源码

1、localhost项目 例如【鲸岛】这个中台项目启动地址是localhost。 使用chrome中的【click-to-react-component 】扩展&#xff0c; alt 鼠标左键 选择dom后跳转到对应文件。 click-to-react-component的原理&#xff08;来自ai&#xff09; click-to-react-component 的工作…

FeignClient发送https请求时的证书验证原理分析

背景 微服务之间存在调用关系&#xff0c;且部署为 SSL 协议时&#xff0c;Feignt 请求报异常&#xff1a; Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find vali…

性能优化关键:link、script和meta的正确打开方式

link 标签的主要属性及其作用 属性是否必填作用描述示例值rel是定义当前文档与链接资源的关系&#xff08;必须属性&#xff09;。常见值&#xff1a;stylesheet, icon, preload, preconnect 等。rel"stylesheet" rel"icon"href是指定链接资源的URL。href…

Linux `less` 命令深度解析与高阶应用指南

Linux `less` 命令深度解析与高阶应用指南 一、核心功能解析1. 基本作用2. 与类似工具对比二、选项系统详解1. 常用基础选项2. 高阶选项组合三、高阶应用场景1. 日志分析系统2. 代码审查系统3. 数据管道处理四、特殊文件处理1. 大文件优化查看2. 二进制文件分析五、交互式命令大…

影刀RPA-20-高级操作题2

一、题目 二、链接 方法一&#xff1a;影刀应用分享: 高级考试题2-第二次 方法二&#xff1a;影刀应用分享: 高级考试题2 三、代码 方法一&#xff1a; import xbot from xbot import print, sleep from .import package from .package import variables as glv from xbot…

C# NX二次开发-获取面法向和UV等数据

通过ufun函数UF_MODL_ask_face_props可以获取到面的法向数据和UV和半径等数据。 代码如下&#xff1a; double[] uvs new double[4];double[] param new double[2];double[] point new double[3];double[] u1 new double[3];double[] v1 new double[3];double[] u2 new d…

SpringBoot整合Sa-Token:实现RBAC权限模型

Java系列文章 文章目录 Java系列文章前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备 二、表结构设计2.1 ER图示例2.2 数据库表设计2.2.1 用户表2.2.2 角色表2.2.3 部门表2.2.4 权限表 三、SpringBoot整合Sa-Token3.1 sa-token基础配置3.1.1 Maven配置3…

工商业储能的“智慧大脑”:解密 Acrel-2000ES EMS 的核心功能与价值

安科瑞电气顾强 市场背景&#xff1a;工商业储能加速崛起 2022年中国已并网的储能项目中&#xff0c;用户侧并网占比为8.36%&#xff0c;其中工商业储能占据了用户侧高达98.6%的份额。驱动这一市场发展的关键因素日益显著&#xff1a; 1.峰谷价差扩大&#xff1a; 全国各省市…

vue+threeJs 根据屏幕调整gltf模型的大小、重心、并更换骑车整体颜色

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“vuethreeJs 根据屏幕调整gltf模型的大小、重心、并更换骑车整体颜色”。 项目案例示意图 1.整体更换gltf模型的颜色 定义&#xff1a;整体代码如下。颜色是事先设定的 const colorAry reactive(["rgb(21…

03 基于 java udp 做一个dns服务器 和 一个dns代理服务器

前言 这个也是 来自于一个朋友的需求 最终的目的是实现一个 dns 代理服务器, 当然 这本质也是一个 dns 服务器 并且 dns 代理服务器是依赖于 一个 dns 服务器的, 因此 顺便给一个 dns 服务器的 demo 这里 主要是 基于 udp 的一个 dns 请求, 响应数据的交互 dns 服务器 …

【HITCSAPP 哈工大计算机系统期末大作业】 程序人生-Hello’s P2P

计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 计算机与电子通信类 学   号 2023112915 班   级 23L0505 学 生 杨昕彦 指 导 教 师 刘宏伟 计算机科学…

第十周作业

一、CSRF 1、DVWA-High等级 2、使用Burp生成CSRF利用POC并实现攻击 二、SSRF&#xff1a;file_get_content实验&#xff0c;要求获取ssrf.php的源码 三、RCE 1、 ThinkPHP 2、 Weblogic 3、Shiro

PTA刷题笔记(难度预警!!!有详解)

7-18 二分法求多项式单根 代码如下&#xff1a; ​ #include <stdio.h> #include <math.h>// 定义多项式函数 double polynomial(double x, double a3, double a2, double a1, double a0) {return a3 * x * x * x a2 * x * x a1 * x a0; }// 二分法求根函数 do…

打破传统范式,线上 3D 画展彰显多元亮点

&#xff08;一&#xff09;沉浸式体验&#xff0c;身临其境赏画​ 线上 3D 画展运用先进的 3D 建模和虚拟现实&#xff08;VR&#xff09;技术&#xff0c;高度还原了真实的展厅环境 。展厅内的布局、灯光&#xff0c;甚至墙壁的质感都被完美复刻&#xff0c;让观众仿佛置身于…

Docker架构详解

一,Docker的四大要素&#xff1a;Dockerfile、镜像(image)、容器(container)、仓库(repository) 1.dockerfile&#xff1a;在dockerfile文件中写构建docker的命令,通过dockerbuild构建image 2.镜像&#xff1a;就是一个只读的模板&#xff0c;镜像可以用来创建docker容器&…