面向对象设计的目标之一在于支持可维护性复用,一方面需要实现设计方案或者源码的重用,另一方面要确保系统能够易于扩展和修改,具有较好的灵活性。 常用的设计原则有七个原则:

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)

一个软件实体应当尽可能少地与其他实体发生相互作用。

迪米特法则要求在设计系统的时候,应该尽量减少对象之间的交互,如果两个对象之间不必彼此通信,那么两个对象就不应该发生任何直接的相互作用;如果其中一个对象需要调用另外一个对象的方法,可以通过第三者转发这个调用。简而言之,就是通过引入一合理的第三者来降低现有对象之间的耦合度。

设计模式<面向对象的常用七大设计原则>的更多相关文章

  1. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  2. java EE设计模式简介

    1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...

  3. 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式

    上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...

  4. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  5. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  6. 设计模式之行为类模式大PK

                                        行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...

  7. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  8. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

  9. java 设计模式

    目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...

  10. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

随机推荐

  1. 00099_commons-IO

    1.导入classpath (1)加入classpath的第三方jar包内的class文件才能在项目中使用: (2)创建lib文件夹: (3)将commons-io.jar拷贝到lib文件夹: (4) ...

  2. WCF REST (二)

    今天主要写下  POST等其他方式 发送请求 以及 流方式 文件的上传与下载 一.Post 提交数据 先来想下 POST和Get 的不同   Get 方式 我们直接通过 url  来传递参数   先来 ...

  3. 软件——keil的查找,错误,不能跳转到相应的行

    为什么MDK  keil4.7双击搜索结果不能跳转到相应位置 KEIL搜索的时候双击不跳转到相应的位置 为什么keil点击不能跳转到错误处的问题 在keil中,双击Find In Files中某一行, ...

  4. 编程一一C语言问题,指针函数与函数指针

    资料来源于网上: 一.指针函数:指返回值是指针的函数      类型标识符    *函数名(参数表)       int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值.函数返 ...

  5. 关于js盒子模型的知识梳理

    盒子模型 JS盒子模型中的13个常用属性: clientWidth/clientHeight:可视区域的宽高,宽高+PADDING组成 clientTop/clientLeft:上边框和左边框的宽度 ...

  6. 4、python基本知识点及字符串常用方法

    查看变量内存地址   id(变量名) ni = 123 n2 = 123 ni和n2肯定是用的两份内存,但是python对于数字在-5~257之间的数字共用一份地址,范围可以修改 name = ‘李璐 ...

  7. iCarousel——在iOS和Mac OS应用中实现3D CoverFlow旋转木马效果的开源类库

    前言 iCarousel一个简单.可高度定制的3D CoverFlow开源类库,旨在简化在 iPhone, iPad和Mac OS中生成各种类型的cover flow(视图切换)效果(分页.滚动视图) ...

  8. liunx基本操作常用命令

    liunx通常用作服务器,运行服务器软件,服务器要等待,类似超市学关键命令操作 内核,外壳 shell命令跟内核打交道用的是发行版本,不是内核,Radhat公司的CentOS,阿里巴巴也用这个 liu ...

  9. netty检测系统工具PlatformDependent

    1. 检测jdk版本 @SuppressWarnings("LoopStatementThatDoesntLoop") private static int javaVersion ...

  10. [NodeJS] Use Now alias for custom sub-domains

    Now is a great way to deploy your node application, but the generated URLs aren't memorable or easil ...