设计模式<面向对象的常用七大设计原则>
面向对象设计的目标之一在于支持可维护性复用,一方面需要实现设计方案或者源码的重用,另一方面要确保系统能够易于扩展和修改,具有较好的灵活性。 常用的设计原则有七个原则:
1.单一职责原则(single responsibility principle,SPR)
一个类只负责一个功能领域中的相应职责。(或者可以定义为:就一个类而言,只有一个原因能够引起它变换)。
单一职责原则是实现高内聚、低耦合的指导方针,是最简单的也是最难运用的原则。
class Chart {
private String type;
public Chart(Object[][] data, String type) {
this.type = type;
if (type.equalsIgnoreCase("histogram")) {
//初始化柱状图
}else if (type.equalsIgnoreCase("pie")) {
//初始化饼状图
}else{
//初始化折线图
}
}
public void display(){
if (this.type.equalsIgnoreCase("histogram")) {
//显示柱状图
}else if (this.type.equalsIgnoreCase("pie")) {
//显示饼状图
}else{
//显示折线图
}
}
}
上面这个类的权责过重,将各种图标对象的初始化代码和显示放在同一个类中实现,就违反了单一职责原则。
2.开闭原则(Open-Close Principe,OCP)
一个软件实体应当对扩展开放,对修改关闭。即软件实体应该在尽量不修改原有代码的情况下进行扩展。
如果一个软件的设计符合开闭原则,那么就可以很方便地对系统进行扩展,而且在扩展的时候无需修改现有代码,是的软件系统拥有使用性和灵活性的同时具备较好的稳定性和延续性。
如Java中的接口、抽象类等机制,可以通过他们的抽象层,将不同的实现香味移至具体的实现层完成。
3.里氏替换原则(Liskov Substitution Principe,LSP)
所有引用父类的地方必须能够透明地使用期子类对象。
在一个软件系统中将一个父类对象替换成它的子类对象,程序将不会产生任何错误和异常,则满足里氏替换原则。
4.依赖倒转原则
抽象不应该依赖于细节,细节应该依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。
5.接口隔离原则
使用多个专门的接口,而不是使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
例如下面的接口就不符合接口隔离原则,这个接口在实现类中不得不将所有的方法实现(客户端需要的和不需要的都需要实现,当然空方法也算实现)。
public interface Client {
// 从文件读取数据
void dataRead();
// 转换成XML格式
void transformToXML();
// 创建图表
void createChart();
// 显示图表
void displayChart();
// 创建文字报表
void createReport();
// 显示文字报表
void displayReport();
}
应该讲接口拆分成一下四个接口:
public interface DataHandler {
// 从文件读取数据
void dataRead();
}
public interface XMLTransformer {
// 转换成XML格式
void transformToXML();
}
public interface ChartHandler {
// 创建图表
void createChart();
// 显示图表
void displayChart();
}
public interface ReportHandler {
// 创建文字报表
void createReport();
// 显示文字报表
void displayReport();
}
6.合成复用原则(Composite Reuse Principe,CRP)
尽量使用对象的组合,而不是继承来达到复用的目的。
这个原则就是在一个新的对象中通过关联关系(组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分,尽量少用继承。
7.迪米特法则(Law of Demeter,LoD)
一个软件实体应当尽可能少地与其他实体发生相互作用。
迪米特法则要求在设计系统的时候,应该尽量减少对象之间的交互,如果两个对象之间不必彼此通信,那么两个对象就不应该发生任何直接的相互作用;如果其中一个对象需要调用另外一个对象的方法,可以通过第三者转发这个调用。简而言之,就是通过引入一合理的第三者来降低现有对象之间的耦合度。
设计模式<面向对象的常用七大设计原则>的更多相关文章
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- java EE设计模式简介
1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...
- 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式
上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...
- 《JavaScript设计模式 张》整理
最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- 设计模式之行为类模式大PK
行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...
- .NET设计模式访问者模式
一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...
- Java开发中的23种设计模式详解
[放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...
- java 设计模式
目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
随机推荐
- Java Web学习总结(4)——HttpServletResponse对象入门
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象即然代表请求和响应,那我们 ...
- Hadoop ecosystem 生态圈
Cascading: hadoop上面的workflow Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行 ...
- [D3] Adding Arrows to Links
svg.append('defs').selectAll('marker') .data(['end']).enter() .append('marker') .attr('id', String) ...
- 让你更值钱的方法:培养稀缺(追逐新技术,淬炼已有技能、做到出类拔萃,寻找自己所在的行业痛点,App开发者是市场动态平衡的典型)
一个开发者,如何才能更值钱? 答案非常简单:掌握稀缺资源. 那么,怎样才能持续不断地掌握稀缺资源,让自己更值钱呢? 请看接下来介绍的 2 种识别稀缺的方法和 2 种培养稀缺的策略. 稀缺资源的秘密 资 ...
- 1.1 Python基础知识 - 变量
1.什么是变量? 变量是可以通过变量名访问的内存地址,变量通常是可变的. 2.怎样去定义? 变量格式: 变量名 = "变量值" 例如: name = "Zhanghk&q ...
- WIN7/8/10下批处理提权工具
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 自动添加批处 ...
- 基于AndFix的热修复 成功后简单的总结总结错失
首先了解热修复是什么东西?? 就我自己简单的理解:就是不须要又一次打包 公布到市场 然后再让用户又一次下载就能够把一些小bug和需求通过补丁的形式进行改动. 然后如今的热修复方式有大致的三种: 1.d ...
- 中间件、服务器和Web服务器三者的区别
相信很多的Web安全初学者和我一样,对中间件和服务器的认识不够深刻,对两者的概念可能会有所混淆. 正好今天在学习的时候突然想到了这个问题,粗略百度了一下,似乎网上对这个问题的解释不多,那么就由我来为大 ...
- swift项目第十天:网络请求工具类的封装
import UIKit /* 必须先导入头文件:import AFNetworking */ import AFNetworking //MARK:-0:定义枚举:以枚举定义请求网络的get和pos ...
- 可视化格式模型(visual formatting model)
原文 简书原文:https://www.jianshu.com/p/7632f16ff555 大纲 1.认识可视化模型 2.可视化模型的内容 3.可视化模型的影响因素 1.认识可视化模型 盒子模型是C ...