[设计模式] OOP六大原则

news2024/9/24 11:23:07

文章目录

  • 前言
  • 1、六大原则
    • 1.1、单一职责原则
    • 1.2、开闭原则
    • 1.3、里氏替换原则
    • 1.4、依赖倒置原则
    • 1.5、接口隔离原则
    • 1.6、迪米特原则


前言

Object Oriented Programming 面向对象编程

1、六大原则

1.1、单一职责原则

就一个类而言,应该仅有一个引起它变化的原因。应该只有一个职责。
在这里插入图片描述

分析:
(1)init() 的作用是在登录时,对登录界面进行初始化
  (2)display() 负责显示登录界面
  (3)validate() 对当前界面用户输入的信息进行语法合法性检验,这个是语法验证,比如说用户的密码输入了没有,是否为空;年龄是否是负数…而不是对用户进行合法性验证
  (4)getConnection() ,findUser() ,用户的信息保存在数据库中,要进行用户信息的验证,要连接数据库,并且在数据库中寻找输入的用户。
  (5)main() ,是整个系统的入口
存在问题
根据单一职责原则,一个应该只有一个职责。现在的登录类大体来讲至少有3种职责。
  (1)前面三个方法是合理的,都是与登录界面有关系的。初始化登录界面,展示登录界面,对界面输入的信息进行语法性检验。
  (2)但是 getConnection() 和 findUser() 这两个方法是与业务逻辑有关系的,他们是用来判断一个用户是否是合法的。
  (3)main() 方法与登录类没有关系,它是整个系统的入口。只不过是恰好存在系统入口是先进入登录界面的情况
  单一职责另外一种定义:就一个类而言,应该仅有一个引起它变化的原因。从这个角度出发,登录类承担的职责过多,有多个引起它发生变化的原因。
  比如说,界面发生变化,要修改 display() ;数据库里面的用户发生变化要修改 getConnection();如果入口要增加一些触发工作,要修改 main()

重构:
在这里插入图片描述

1.2、开闭原则

一个软件实体应当对扩展开放,对修改关闭。
也就是说在设计 一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即在不修改源代码的情况下改变这个模块的行为。
在这里插入图片描述
在这里插入图片描述

重构:
(1)解决问题的思路:抽象化是开闭原则的关键,开闭原则要将可变的东西进行封装,将可变的东西进行封装变成稳定东西。
(2)找出可变点,在这里可变的就是按钮的形状,所以需要将它稳定下来,也就是进行抽象化,封装。
在这里插入图片描述

1.3、里氏替换原则

所有引用基类(父类)的地方必须能够透明地使用子类的对象。也就是能用子类替换父类,替换之后程序的行为没有发生改变。
子类可以扩展父类的功能,但不能改变父类原有的功能。
子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。
在这里插入图片描述

问题:几维鸟类重写了父类的方法,违背了里氏替换原则。
在这里插入图片描述

1.4、依赖倒置原则

依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
在这里插入图片描述

问题:新增手机通信,就得修改People类
在这里插入图片描述

1.5、接口隔离原则

接口隔离原则:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
也就是说,接口尽量细化,同一接口中的方法尽量少。

public interface CustomerDataDisplay {
	List<CustomerData> dataRead();
	void transformToXml();
	void createChart();
	void displayChart();
	void createReport();
	void displayReport();
}

现在有一个图表类ChartClass实现了CustomerDataDisplay接口,该类就要实现接口的全部方法,正常来说ChartClass只需要createChart()、displayChart()方法即可,因为CustomerDataDisplay接口方法太多了,承担了太多职责,颗粒度太大了ChartClass类不得不空实现其他方法,违背了接口隔离原则。
重构满足接口隔离原则

public interface DataHandler {
	List<CustomerData> dataRead();
}
public interface XMLTransformer {
	void transformToXml();
}
public interface ChartHandler {
	void createChart();void displayChart();
}
public interface ReportHandler {
	void createReport();void displayReport();
}

1.6、迪米特原则

迪米特法则(Law of Demeter)又叫作最少知道原则(The Least Knowledge Principle),通俗的来讲,就是一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄漏任何信息。

Boss想从TeamLeader那里知道现有课程的总数。它们之间的调用关系应该为
Boss—>TeamLeader—>Course。
Boss与Course并无直接联系,所以在Boss类的方法中不应该出现Course类。一下给出合理的设计方案。

/**
* boss类不需要知道课程信息,只与TeamLeader通信
**/
public class Boss {
	public void commandCheckNumber(TeamLeader teamLeader){
		teamLeader.checkNumberOfCourses();
	}
}
/**
* TeamLeader 只与课程通信
**/
public class TeamLeader {
	public void checkNumberOfCourses(){
		List<Course> courseList = new ArrayList<Course>();
		for(int i = 0 ;i < 20;i++){
			courseList.add(new Course());
		}
		System.out.println("在线课程的数量是:"+courseList.size());
	}
}
/**
* 课程类
**/
public class Course {
}
/**
* boss只需要通过调用teamLeader 就可以 知道最后的信息
**/
public class Test {
	public static void main(String[] args) {
		Boss boss = new Boss();
		TeamLeader teamLeader = new TeamLeader();
		boss.commandCheckNumber(teamLeader);
	}
}

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

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

相关文章

MIT 6.S081 (BOOK-RISCV-REV1)教材第四章内容 -- 下

MIT 6.S081 教材第四章内容 -- 下 引言从内核空间陷入页面错误异常Page Fault BasicsLazy page allocationZero Fill On DemandCopy On Write ForkDemand PagingMemory Mapped Files 真实世界 引言 MIT 6.S081 2020 操作系统 本文为MIT 6.S081课程第四章教材内容翻译加整理。…

机器人工程创新类课程补充说明-2023-

内容仅供参考&#xff0c;不严谨。 案例&#xff1a; 在f1tenth仿真中如何实现更快速的跑圈-曲线分析篇 所有课程其实主动权永远都掌握在学生手中&#xff0c;愿意学的会多花时间自主研究&#xff08;主动学习&#xff09;&#xff0c;不愿意的就会用一些独特手段应付&#xf…

硬件入门之什么是电感

硬件入门之什么是电感 文章目录 硬件入门之什么是电感一、电感是什么&#xff1f;电感在电路中的作用&#xff1a;通直流隔交流&#xff0c;防止电流突变&#xff0c;储能。 二、实际应用场景常见电容&#xff1a;1.贴片电感&#xff08;无正负极之分&#xff09;2、变压器&…

第六章 MobileNetv1网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

chatgpt赋能python:Python文件怎么改名:简单易用的方法

Python文件怎么改名&#xff1a;简单易用的方法 在Python开发中&#xff0c;文件的重命名是一个经常用到的操作。无论是更改文件名还是批量重命名&#xff0c;在Python中都可以非常轻松地实现。本文将介绍三种不同的方法来改变Python文件的名称。 方法一&#xff1a;使用os模…

哔哩下载姬 - DownKyi

这款开源工具小编自己还是蛮喜欢的&#xff0c;有兴趣的小伙伴可以体验学习下。 一、简单介绍 Downkyi是一个极其便捷的开源工具&#xff0c;专为Bilibili视频下载而设计。它拥有一个简洁、直观的界面&#xff0c;操作逻辑流畅无比。Downkyi能够下载几乎所有B站视频&#xff0…

11.创建CentOS虚拟机

创建不同类型的实例虚拟机&#xff0c;我们是需要根据需求来准备镜像上传到glance&#xff0c;注意 ISO 镜像上传上去是没法直接使用的&#xff0c;需要将 ISO 镜像转变成qcow2磁盘文件&#xff0c;然后上传磁盘文件&#xff0c;就可以创建云主机。 官方镜像仓库地址&#xff1…

FBM237 RH914XS而且控制部件采用冗余容错技术,运行可靠性提高

​ FBM237 RH914XS而且控制部件采用冗余容错技术,运行可靠性提高 FBM237 RH914XS而且控制部件采用冗余容错技术,运行可靠性提高 概述 dcs系统与其他计算机设备是由电子元件和大规模集成电路构成&#xff0c;结构紧密&#xff0c;而且控制部件采用冗余容错技术,运行可靠性提高。…

人工智能气象一:深度学习预测浅水方程模式

查看原文>>>基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用能力 目录 专题一、Python软件的安装及入门 专题二、气象常用科学计算库 专题三、气象海洋常用可视化库 专题四、爬虫和气象海洋数据 专题五、气象海洋常用插值方法 专题六、机器…

AIGC下的CV多模态原理解析:从CLIP/BLIP到stable diffusion/Midjourney、GPT4

前言 终于开写本CV多模态系列的核心主题&#xff1a;stable diffusion相关的了&#xff0c;为何执着于想写这个stable diffusion呢&#xff0c;源于三点 去年stable diffusion和midjourney很火的时候&#xff0c;就想写&#xff0c;因为经常被刷屏&#xff0c;但那会时间错不…

RabbitMQ入门案例之Work模式

前言 本文章将介绍RabbitMQ的Work模式&#xff0c;其中这个模式又细分为轮询分发和公平分发&#xff0c;本文将会用Java代码结合RabbitMQ的web管理界面进行实操演示。 官网文档地址&#xff1a;https://rabbitmq.com/getstarted.html 什么是Work模式 RabbitMQ的Work模式是一种…

ActiveX控件打包成Cab置于网页中自动下载安装

[背景] 做过ActiveX控件的朋友都知道&#xff0c;要想把自己做的ActiveX控件功能放在自己的网页上使用&#xff0c;那么用户在客户端就必须进行本地的注册&#xff0c;也就是说用户得首先要把该ActiveX控件(test.ocx)放在本机的%system%/system32下&#xff0c;然后运行DOS工具…

Linux:第四章课后习题及答案

第四章 目录和文件管理 Q1&#xff1a;Linux系统中有哪些文件类型 Linux文件类型常见的有&#xff1a;普通文件、目录 文件、设备文件&#xff08;字符设备文件和块设备 文件&#xff09;、管道文件和符号链接文件等。普通文件 用“ls -lh”命令查看某个文件的属性&#xff0…

Docker 部署 分布式搜索引擎 Elastic Search

文章目录 ⛄引言一、使用Elastic Search 的好处二、部署ES⛅部署kibana⚡部署分词器 三、词典扩展与停用⛅扩展词典⚡停用词典 ⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮…

【C++篇】模板

友情链接&#xff1a;C/C系列系统学习目录 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的…

使用 InstructPix2Pix 对 Stable Diffusion 进行指令微调

本文主要探讨如何使用指令微调的方法教会 Stable Diffusion 按照指令 PS 图像。这样&#xff0c;我们 Stable Diffusion 就能听得懂人话&#xff0c;并根据要求对输入图像进行相应操作&#xff0c;如: 将输入的自然图像卡通化 。 图 1&#xff1a;我们探索了 Stable Diffusion …

深入探索Android应用启动原理:从入口到界面展示

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

day12_面向对象的三大特征之一(封装)

封装概述​​​​​​​ 为什么需要封装&#xff1f; 现实生活中&#xff0c;每一个个体与个体之间是有边界的&#xff0c;每一个团体与团体之间是有边界的&#xff0c;而同一个个体、团体内部的信息是互通的&#xff0c;只是对外有所隐瞒。例如&#xff1a;我们使用的电脑&a…

【从删库到跑路】MySQL数据库的查询(单表查询,多表查询,内外连接,联合查询,子查询)

&#x1f38a;专栏【MySQL】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 文章目录 &#x1f354;多表查询⭐多表关系&#x1f388;一对多&#x…

自动化运维工具-Ansible详解

目录 一、Ansible介绍 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;特性 &#xff08;三&#xff09;优势 &#xff08;四&#xff09;基本架构 &#xff08;五&#xff09;任务执行模式 &#xff08;六&#xff09;ansible与其余配置管理软件的对比 二、…