文档章节

JAVA设计模式--设计原则

Candy_Desire
 Candy_Desire
发布于 2014/11/19 16:19
字数 1278
阅读 410
收藏 5
点赞 2
评论 0

一、基本原则:

单一职责原则--Single Responsibility Principle(SRP)

开放封闭原则--Open Closed Principle(OCP)

里氏替换原则--Liskov Substitution Principle(LSP)

最少知识原则--Least Knowledge Principle(LKP)

接口隔离原则--Interface Segregation Principle(ISP)

依赖倒置原则--Dependence Inversion Principle(DIP)

【以上是六大设计原则:S O L L I D(首字母)-- Solid(固定的,稳定的)也称作SOLID原则】

下面分别介绍下这六大原则

1.1、单一职责原则(SRP)

There should never be more than one reason for a class to change.

【一个类只能由唯一一个因素来改变】

对于开发而言,有时会发现一个类拥有两种或者多种职责,这时就需要分析一下是否有必要将这些不同的职责分离开来,尽量不要让一个类从事太多的职责,分工明确反而会事半功倍。

1.2、开放封闭原则(OCP)

Software entities like classes, modules and functions should be open for extension but closed for modifications.

【软件实体如:类、模块和函数、应该是开放式的拓展,封闭式的修改】

如果遇到需求有变动或者要修改代码的时候尽量用集成或组合的方式来拓展类的功能而不要直接修改类本身的代码,当前前提是对整体架构部产生任何影响,原则是死的设计的时候可以依照情况而定。

1.3、里氏替换原则(LSP)

Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.

【所有引用基类的地方必须能够透明的使用其子类对象】

只要父类出现的地方子类就能够出现,而且替换为子类不会产生任何错误或异常。但是反过来,子类出现的地方,替换为父类就可能出现问题了。

继承父类时,必须重写父类中所有的方法,尤其需要注意父类的 protected 方法(它们往往是让您重写的),子类尽量不要暴露自己的 public 方法供外界调用。

1.4、最少知识原则(LKP)

Only talk to you immediate friends.

【只与你最直接的朋友交流】

该原则也称作“迪米特法则”(Law of Demeter)

尽量减少对象之间的交互,不要让一个类依赖于太多的其他类,需尽量减小依赖关系从而减小类之间的耦合。简言之,低耦合,高内聚。

1.5、接口隔离原则(ISP)

The dependency of one class to another one should depend on the smallest possible interface.

【一个类与另一个类之间的依赖性,应该依赖于尽可能小的接口】

不要对外暴露没有实际意义的接口。尽可能保证接口的实用性,在对其他类的引用上,一个对象对其他对象的引用应当降到最低。

1.6、依赖倒置原则(DIP)

High level modules should not depends upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions.

【高层模块不应该依赖于低层模块,它们应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象】

面向接口编程是程序员的思维方式,相当于通过事物表象来看本质,属于反向依赖,即依赖倒置。

不是所有的类都需要对应的接口,如果存在接口就尽量用接口去编程。

二、衍生原则:

2.1、好莱坞原则--Hollywood Principle(HP)

所谓好莱坞原则其实就是我们常用的控制反转,对象的创建和管理都是由容器帮我们完成。

2.2、无环依赖原则--Acyclic Dependencies Principle(ADP)

尽量避免出现循环依赖现象(A依赖B依赖C依赖A)“中介者模式”刚好可以解决该问题。

2.3、共同封闭原则--Common Closure Principle(CCP)

尽量将易变的类放在同一包下。该原则是“开放-封闭原则”的衍生。

2.4、共同重用原则--Common Reuse Principle(CRP)

尽量减少包的大小,因为如果重用了包中的某个类,实际上相当于重用了包中所有类。

2.5、组合/聚合复用原则--Composition/Aggregation Resuse Principle(CARP)

尽量使用组合而不是继承的方式阔这类的功能。如:代理模式、装饰模式、适配器模式等

三、实践原则:

3.1、Don't repeat yourself(DRY)

尽可能的封装你的代码以提高代码的重用性。

3.2、Keep it simple and stupid(KISS)

尽量让你的系统界面简洁、功能实用、操作方便。

3.3、Convention over Configuration(COC)

尽量让惯性来减少配置提高开发效率,最终实现零配置。

3.4、Command Query Separation(CQS)

尽量在接口定义的时做到命令和查询分离。

3.5、Separation of Concerns(SOC)

尽量将复杂的问题分离成多个简单的问题然后逐个解决。


【注:在实际应用中要具体问题具体分析,切勿过度设计或滥套原则以至于失去了原则本身的意义】

© 著作权归作者所有

共有 人打赏支持
Candy_Desire
粉丝 31
博文 71
码字总数 84592
作品 0
浦东
产品经理
20个设计模式和软件设计面试问题

不管是参加Java面试还是C#面试,设计模式和软件设计都是任何编程面试中的必问问题。实际上,编程能力和设计技巧是对彼此很好的补充。一个好的程序员通常都是一个好的软件设计人员。他们知道怎...

LCZ777
2014/08/13
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
Java程序员应当知道的10个面向对象设计原则

面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) 、 Decorator(装饰器)、Observer(观察者) 等设计模式,而没有把足够多的注意力放在学习面向对象的...

银月光海
2015/03/16
0
0
java中23种设计模式(上)

参考网址:http://blog.csdn.net/zhangerqing 资源:http://download.csdn.net/detail/zhangerqing/4835830 设计模式(Design Patterns) 设计模式(Design pattern)是一套被反复使用、多数...

青涩的梦
06/26
0
0
Java之美[从菜鸟到高手演变]之设计模式

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代...

只想一个人静一静
2014/02/25
0
2
java开发中的常用的设计模式

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代...

qq_38024548
05/28
0
0
Java语言编程学习之Lambda表达式设计和架构的原则[图]

Java语言编程学习之Lambda表达式设计和架构的原则[图]: 大家都知道,Lambda表达式是对Java语言的一点简单改进,在JDK标准类库中,运行它的方式各种各样。但是大多数的Java代码都不是由开发J...

原创小博客
07/17
0
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
05/08
0
0
Java程序员应了解的10个面向对象设计原则

面向对象设计原则是 OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数 Java 程序员追逐像 Singleton、Decorator、Observer 这样的设计模式,而不重...

effort_fan
2012/04/09
0
0
通过例子来理解巧妙绝伦的工厂模式

每次读设计模式的书,都感觉自己收获颇多。《Head First 设计模式》在学校的时候就买下了,刚开始初学java的时候,经常问别人,设计模式有没有用,设计模式的好处在哪里。后来参加工作,在工...

夕水溪下
2012/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
1
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0
expect同步文件&expect指定host和要同步的文件&构建文件分发系统&批量远程执行命令

20.31 expect脚本同步文件 expect通过与rsync结合,可以在一台机器上把文件自动同步到多台机器上 编写脚本 [root@linux-5 ~]# cd /usr/local/sbin[root@linux-5 sbin]# vim 4.expect#!/...

影夜Linux
今天
1
0
SpringBoot | 第九章:Mybatis-plus的集成和使用

前言 本章节开始介绍数据访问方面的相关知识点。对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数...

oKong
今天
13
0
win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
今天
2
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
今天
2
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 vim 4.expect [root@yong-01 sbin]# vim 4.expect#!/usr/bin/expectset passwd "20655739"spawn rsync -av ro...

lyy549745
今天
1
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
今天
1
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
今天
3
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部