设计模式<面向对象的常用七大设计原则>
面向对象设计的目标之一在于支持可维护性复用,一方面需要实现设计方案或者源码的重用,另一方面要确保系统能够易于扩展和修改,具有较好的灵活性。 常用的设计原则有七个原则:
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) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
随机推荐
- TTL和RS232之间的详细对比
[背景] 之前就听过TTL,一直没搞懂其和RS232的区别. 最近,打算去买个USB转RS232的芯片,结果找到此产品: 六合一多功能USB转UART串口模块CP2102 usb TTL485 232 ...
- spring-data-redis 使用
以前使用过Jedis,后面因项目需要使用spring-data-redis,设置一个键值及其过期时间后怎么都不对. 源代码: redisTemplate.opsForValue().set(key, ...
- Android开发之搜芽项目的图片载入问题(使用Volley进行网络图片载入)
搜芽的移动开发这几天进度相对来说很的快. 可是美中不足的就是网络图片的载入问题. 我有两套方案: 1)沿用迅雷动漫的图片载入.迅雷动漫也是用的一个开源的库.可是不知道是我使用出了问题还是真的是它的问题 ...
- android开发设计辅助工具整理
1.Button设计工具button设计
- 鲁德http://www.testroad.org/topic/76
[最新的招聘信息]:1.联动优势科技有限公司招聘性能测试工程师 薪资20K左右 http://ask.testroad.org/article/4042.上海-交通银行总行-性能测试专家 ...
- 6、修改应用程序数码相框以支持自动关闭LCD
1. 修改数码相框以自动关闭LCD关闭LCD : 在读取触摸屏的函数中判断:如果15S内无数据,执行: echo auto > /sys/devices/platform/mylcd/power ...
- SiFive Unleashed启动
SiFive Unleashed启动 请仔细参看SiFive官网的文档HiFive Unleashed 使用串口连接过程 连接好硬件(电源+USB) 尝试打开电源键,检测硬件能被识别 配置minico ...
- AE 向已存在的要素类中添加字段
风过无痕 原文向已存在的要素类中添加字段 以前,在用AE写程序的时候,为了方便,一般都是直接新建一个MapControl窗体应用程序.这次需要解决的问题用不到窗口,就突发奇想,直接新建了一个Conso ...
- 33、给华美A100刷固件
给HAME A100刷固件 目的: 1. 给HAME A100刷固件 2. 配置上UVC驱动 3. 修改内核自带的UVC驱动,使其支持我们自制的二合一摄像头 4. 移植mjpg-streamer 5. ...
- 3、Pycharm使用
1.设置文件模板 file->settings->Editor->File and Code Templates->Python Script 2.运行 a.点击要运行的文件, ...