Java 面向对象的设计原则

  一、

  1、面向对象思想的核心:

  封装、继承、多态。

 

  2、面向对象编程的追求:

  高内聚低耦合的解决方案;

  代码的模块化设计;

 

  3、什么是设计模式:

  针对反复出现的问题的经典解决方案,是对特定条件下(上下文)问题的设计方案的经验总结,是前人设计实践经验的精华。

 

  4、面向对象设计原则

  是面向对象设计思想(法理精神)的提炼(基本宪法),比面向对象思想的核心要素更具有实操性,比设计模式(各种具体法律条文)更抽象。

 

  5、如何最大限度降低耦合度?

  1. 少用类的继承,多用接口隐藏实现细节。
  2. 避免使用全局变量。
  3. 多用设计模式。如MVC~
  4. 尽量不用“硬”编码方式写程序,尽量避免直接使用SQL语句操作数据库。
  5. 避免直接操作或调用其它模块或类,无法避免就尽量减小耦合程度

 

  7、面向对象常用设计原则:SOLID

  1. 单一职责原则;
  2. 开放封闭原则;
  3. Liskov替换原则;
  4. 接口隔离原则;
  5. 依赖倒置原则;
  6. 迪米特法则;
  7. 合成/聚合复用原则;

 

  二、

  1、最小化访问权限

  从信息隐藏的角度看,应该最大程度对类进行封装,只要有可能就把方法和属性成员定义为私有,再考虑逐步增加权限。       

  防御式(Defensive)编程:防御式设计的体现,为了保证对程序的不可预见的使用不会造成之后程序功能的破坏。

  如何保护程序免受非法数据的破坏?

  1. 检查来自外部资源的数据值,例如来自网络的数据值和来自文件的数据值;
  2. 检查子程序所有输入参数的值,与上类似;
  3. 决定如何处理错误的输入数据,对不同的错误类型进行处理。

 

  2、以类代替基本数据类型

  类中如果有相互关联的多个基本数据类型,应将其抽取为一个类。

 

  3、单一职责

  涵义:一个类只涉及用来实现一个职责,只会有一个引起变化的原因。

  面向对象设计的核心任务,就是发现职责并把这些职责相互分离。如果能想到多余一个动机去改变一个类,那么这个类就具有多一个职责,应考虑分解。

  

  4、不要重复造轮子

  定义:不写重复的代码(针对功能而不是代码),用Abstraction类抽象公有的东西。 

  若多次用到一个硬编码值,则将其设置为公共常量;

  若需要在两个以上的地方使用一个代码块,可以将其抽取为一个独立的方法。

  不能滥用功能代码的合并!

  

  5、开放封闭原则(OCP)

  定义:软件实体应该对扩展开放,而对修改封闭。

  对扩展开放,意味着有新的需求变化时,可以对现有代码进行扩展,适应新情况。

  对修改封闭,意味着一旦设计完成,不要对类的实现做修改。

  如何做到?

       核心思想:对抽象编程,不是针对具体编程。

  编程角度:

  针对接口编程,而不是针对实现编程。

  应该使用接口类型作为方法返回类型、方法参数类型。

 

  6、里氏替换原则(LSP)

  定义:任何基类可以出现的地方,子类一定可以出现。

  只有当子类可以替换父类,软件单位的功能不受影响时,父类才能真正被复用,而子类也可以在父类的基础上增加新的行为。

  如果子类不能完整地表达父类,那么建议断开父子继承关系,采用组合等关系替代。

 

  7、依赖倒置原则(DIP)

  定义:程序设计要依赖抽象,不要依赖具体。即对抽象编程,不要对实现进行编程,降低调用类与实现模块间的耦合。

   高层次模块不应该依赖于低层次模块,都应该依赖于抽象;

  抽象不应该依赖于具体,具体应该依赖于抽象。

 

  8、迪米特法则

  涵义:又称最少知识原则,即一个对象应当对其他对象了解得尽可能少。

  目的:

  降低类之间的耦合,让每个类尽量减少对其他类的依赖。

  不过这样也可能造成系统中存在大量的中介类,臃肿。

 

转载于:https://www.cnblogs.com/bigbigbigo/p/8422297.html

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

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

相关文章

java获取panel面板画笔_java - paintComponent()与paint()和JPanel vs Canvas在画笔类型的GUI中 - 堆栈内存溢出...

我一直试图找到一个解决方法,但没有找到一个,特别是对于getGraphics()方法:如何将图形添加到面板?你记得需要绘制的变量是什么,并在paintComponent()中使用它。 例如,您在其他问题中尝试做的事情如下&#…

springboot jpa 创建数据库以及rabbitMQ分模块扫描问题

在使用jpa过程中,如果没有在配置中加入自动创建实体对于的sql,则需要提前创建建表语句 spring.jpa.properties.hibernate.show_sqltrue spring.jpa.properties.hibernate.format_sqltrue spring.jpa.hibernate.ddl-autoupdate 建表语句需要注意的点:需要…

cpp_06_缺省构造_拷贝构造_拷贝赋值_初始化表

1 构造函数 1.1 构造函数可重载&#xff1a; 构造函数可以通过形参表的差别化形成重载关系 重载关系的构造函数&#xff0c;通过构造函数的实参类型进行匹配 使用缺省参数可以减少构造函数重载的数量 // consover.cpp 构造函数的重载 #include <iostream> using name…

mysql sumif条件求和_sumif与sumifs条件求和函数详解,小白到大神的必经之路

在日常工作中我们经常需要根据某些条件进行求和&#xff0c;今天就给大家介绍下&#xff0c;Excel中的条件求和函数sumif和sumifsSumif函数第一个参数&#xff1a;Range&#xff1a;条件区域&#xff0c;用于条件判断的单元格区域。第二个参数&#xff1a;Criteria&#xff1a;…

第二类斯特林数总结

第二类斯特林数总结 标签&#xff1a; 第二类斯特林数 最近做题的时候遇到了一些跟第二类斯特林数有关的东西&#xff0c;发现网上的资料不是很多&#xff0c;于是写一篇博客来总结一下。 第二类斯特林数 定义 第二类斯特林数\(S(n,m)\)表示的是把n个不同的小球放在m个相同的盒…

python 装饰器 继承_Python设计模式之装饰器模式

装饰器模式无论何时我们想对一个对象添加额外的功能&#xff0c;都有下面这些不同的可选方法。如果合理&#xff0c;可以直接将功能添加到对象所属的类(例如&#xff0c;添加一个新的方法)使用组合使用继承注意&#xff0c;本文中的Decorator可以为装饰器或者修饰器。与继承相比…

Thread.join(), CountDownLatch、CyclicBarrier和 Semaphore区别,联系及应用

在java 1.5中&#xff0c;提供了一些非常有用的辅助类来帮助我们进行并发编程&#xff0c;比如CountDownLatch&#xff0c;CyclicBarrier和Semaphore&#xff0c;今天我们就来学习一下这三个辅助类的用法&#xff0c; 由于Thread.join()也和这三个类有类似用法&#xff0c;我也…

string转short java_[Java基础]之 数据类型转换

数据类型转换存在的意义数据类型转换&#xff0c;在实际的应用开发中&#xff0c;常常会对不同类型的数字类型进行计算&#xff0c;所以就用到了数据转换。一方面&#xff0c;使用算术计算符对数字进行运算时&#xff0c;系统在适当的时候回进行自动转换&#xff1b;另一放方面…

adb 静默安装_怎么实现Android APP静默安装

在 Android 中&#xff0c;如果要使用系统限制的权限(比如 android.permission.WRITE_SECURE_SETTINGS)&#xff0c;我们需要把程序安装到 /system/app/ 下。下面以 SecureSetting.apk 为例&#xff0c;演示这个操作。需要准备一台已经获得 Root 权限的手机。1、通过 USB 连接手…

跟我一起读postgresql源码(十六)——Executor(查询执行模块之——control节点(下))

5.ModifyTable节点 先看一个ModifyTable节点的例子&#xff1a; postgres# explain update test_01 set id 5 where name xxx;QUERY PLAN ---------------------------------------------------------------Update on test_01 (cost0.00..23.75 rows6 width48)-> Seq Sc…

java获取对象的子_java – 如何根据子对象字段获取父对象

家长班&#xff1a;public class Person {String firstName;String lastName;Long id;List phoneNumber new ArrayList<>();int age;public Person(String firstName, String lastName, int age, Long id, List phone) {super();this.firstName firstName;this.lastNam…

vscode格式化关于符合eslint检测语法配置

.js文件插件&#xff1a;JavaScript Standard Style配置&#xff1a;解决ES6语法格式化 {"files.associations": {"*.js": "javascriptreact"} }.vue文件 配置&#xff1a; {"vetur.format.defaultFormatter.js": "vscode-typesc…

二、配置数据源、SessionFactory、domain对象

1.在applicationContext.xml中配置数据源 <?xml version"1.0" encoding"utf-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context"h…

IDEA建立Spring MVC Hello World 详细入门教程

引子&#xff0c;其实从.NET转Java已经有几个月时间了&#xff0c;项目也做了不少&#xff0c;但是很多配置都是根据公司模板或者网上教程比忽略画瓢&#xff0c;对其中最简单的配置和设置并不完全理解&#xff0c;依旧是小白用户。最近项目不忙&#xff0c;重新梳理了一下Spri…

java offsetdatetime_Java OffsetDateTime withHour()用法及代码示例

Java中OffsetDateTime类的withHour()方法返回此OffsetDateTime的副本&#xff0c;其中一天中的小时数按照参数中的指定进行了更改。用法:public OffsetDateTime withHour(int hour)参数&#xff1a;此方法接受单个参数hour&#xff0c;该参数指定要在结果中设置的一天中的小时&…

2048小游戏代码解析 C语言版

2048小游戏&#xff0c;也算是风靡一时的益智游戏。其背后实现的逻辑比较简单&#xff0c;代码量不算多&#xff0c;而且趣味性强&#xff0c;适合作为有语言基础的童鞋来加强编程训练。本篇分析2048小游戏的C语言实现代码。 前言 游戏截图&#xff1a; 游戏实现原理&#xff1…

java中Decimaformat_Java中 DecimalFormat 用法详解

对Java中 DecimalFormat 的所有基础用法进行了一个汇总。DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充&#xff0c;# 表示只要有可能就把数字拉上这个位置。下面的例子包含了差不多所有的基本用法。import java.text.DecimalForm…

java的栈堆的理解_理解堆与栈 - 一步一个脚印 - BlogJava

一、引言&#xff1a;一直不太明白堆与栈到底是什么&#xff0c;是指一块内存区呢&#xff0c;还是指一种数据结构&#xff1f;编写程序中总提到内存分配的栈与堆的区别&#xff0c;静态与动态分配等&#xff0c;总也弄不明白&#xff0c;隐约知道一点&#xff0c;但总分不清堆…

【递归与递推】青蛙过河

题目描述 有一条河&#xff0c;左边一个石墩(A区)上有编号为1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;…&#xff0c;n的n只青蛙&#xff0c;河中有k个荷叶(C区)&#xff0c;还有h个石墩(D区)&#xff0c;右边有一个石墩(B区)&#xff0c;如下图2—5所示。n只青蛙…

人民币读法的java程序_Java浮点数转人民币读法

packagetheTest;public classNumToRmb {private String[] hanArr{"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};private String[] unitArr{"仟",&quo…