文档章节

JAVA设计模式--设计原则

Candy_Desire
 Candy_Desire
发布于 2014/11/19 16:19
字数 1278
阅读 410
收藏 5

一、基本原则:

单一职责原则--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
浦东
产品经理
设计模式 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
20个设计模式和软件设计面试问题

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

LCZ777
2014/08/13
0
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之所...

路小磊
07/21
0
10
Java程序员应当知道的10个面向对象设计原则

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

银月光海
2015/03/16
0
0
练就Java24章真经—你所不知道的工厂方法

前言 最近一直在Java方向奋斗《终于,我还是下决心学Java后台了》,今天抽空开始学习Java的设计模式了 。计划有时间就去学习,你这么有时间,还不来一起上车吗? 之所以要学习Java模式,是因...

codeGoogle
09/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux 中不适用功能键切换TTY

本简要指南介绍了在类 Unix 操作系统中如何在不使用功能键的情况下切换 TTY。在进一步讨论之前,我们将了解 TTY 是什么。正如在 AskUbuntu 论坛的一个答案[1]中所提到的,TTY这个词来自 Tele...

问题终结者
12分钟前
0
0
OSChina 周三乱弹 —— 我自己总觉得我的灵魂有毒

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @Devoes :分享王菲的单曲《匆匆那年 (Fleet of Time)》 《匆匆那年 (Fleet of Time)》- 王菲 手机党少年们想听歌,请使劲儿戳(这里) 天长地...

小小编辑
18分钟前
3
3
深度学习与图像处理实例:人像背景虚化与背景替换

简单人像背景虚化处理思路如下: 对图像内容分割,提取人像,背景 背景模糊处理 人像与模糊处理后的背景融合 本实例使用DeepLabV3图像分割深度学习模型实现。代码如下: import numpy as np...

IOTService
昨天
0
0
八月新增开源项目:假装自己是图形界面的 Git 命令行工具

每月新增开源项目。顾名思义,每月更新一期。我们会从社区上个月新收录的开源项目中,挑选出有价值的、有用的、优秀的、或者好玩的开源项目来和大家分享。数量不多,但我们力求推荐的都是精品...

编辑部的故事
昨天
8
0
20180918 find命令与Linux文件扩展名

命令find 用来查找搜索文件。 搜索文件相关命令: which 从环境变量里的目录中去搜索 whereis(不常用) 从一个固定的库中搜索 locate(需要单独安装 yum install -y mlocate) 查询时会从/var/...

野雪球
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部