UML类图与面向对象设计原则
1. 引言
从大一开始学习编程,到如今也已经有两年了。从最初学习的Html,Js,JaveSe,再到JavaEE,Android,自己也能写一些玩具。学习过程中也无意识的了解了一些所谓的设计模式,如今打算系统的学习。学习以书《设计模式的艺术——软件开发人员内功修炼之道/刘伟著》为主。
所谓设计模式,即是前人对某类相似问题的抽象给出的解决方案。书中给出了23(Gof)+1(简单工厂模式)种设计模式。每种模式的学习将关注以下几点:名称(Name),问题(Problem),解决方案(Solution),效果(Consequence)。
2. UML
先从UML学起。
从它的全称Unified Modeling Language就可以看出,它是一种分析设计语言(建模语言)。
主要有视图(View),图(Diagram),模型元素(Model Element),通讯机制(General Mechanism)几个部分。
类的属性和方法表示方式分别如下:
可见性 属性名:类型 [ = 默认值]
可见性 方法名(参数列表) [ :返回值类型]
例子如下:
① 关联关系
1)双向关联。例子如下:
2)单向关联。例子如下:
3)自关联。例子如下:
4)多重性关联。例子如下:
5) 聚合关系。例子如下:
6)组合关系。与聚合关系类似,不同之处在于,组合关系更强调一种依附(寄生)关系。例子如下:
② 依赖关系。例子如下:
View(视图)类的draw方法依赖于Canvas(画布)类的传入。
③ 泛化关系(继承关系)。例子如下:
④ 接口与实现关系。例子如下:
3. 面向对象设计原则
① 单一职责原则
一个类只负责一个功能领域中的相应职责。或者说,就一个类而言,应该只有一个引起它变化的原因。
单一职责原则的目的是实现高内聚、低耦合,其核心思想是一个类不能太“累”。在软件系统中,一个类的职责越多,它被复用的机会便越小。
如下面这个例子: CustomDataChart类承担了太多的责任:既要负责连接数据库,又负责获取查询客户,还有显示图表的方法。合理的做法是分为3个类:
1)DBUtil:包含连接数据库方法getConnection();
2)CustomDao:包含查找Customs方法findCustoms()方法;
3)CustomDataChart:包含显示图表的方法displayChart();
重构后的结构图如下:
重构的好处是显而易见的:我们将不同职责的方法划分在不同的类中,便于阅读理解;当某个职责发生变化时,如更换了数据库,我们只需要修改DBUtil中的getConnection()方法,而其他的代码都不变。
② 开闭原则
一个软件实体应当对扩展开放,对修改关闭。即软件实体应做到在不修改原有代码的情况下进行扩展。
任何软件都面临一个很重要的问题,即需求会随着时间的变化而变化。但面临新的需求时,软件应尽量保证原有系统的稳定,在不修改原有系统代码的情况加入新的扩展模块。
③ 里氏代换原则
它的严格定义如下:
一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换为o2时,程序P的行为没有变化,那么类型S是类型T的子类型。
它的通俗版定义是:
所有应用基类(父类)的地方必须能被替换为其子类。
即我们在编程时,应面向接口编程。
④ 依赖倒转原则
抽象不应依赖于细节,细节应当依赖于抽象。换言之,应面向接口编程,而不是针对实现编程。
当我们在面向抽象层编程时,要将具体类的对象通过依赖注入的方式注入。常用的注入方式有:构造注入、设值注入和接口注入。
⑤ 接口隔离原则
要尽量使用多个专门的接口,而不要使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
⑥ 合成复用原则
要尽量使用对象的组合,而不是继承来达到复用的目的。
⑦ 迪米特法则
一个软件实体应尽量少的与其他软件实体发生关系。
UML类图与面向对象设计原则的更多相关文章
- 设计模式学习(二):面向对象设计原则与UML类图
一.UML类图和面向对象设计原则简介 在学习设计模式之前,需要找我一些预备知识,主要包括UML类图和面向对象设计原则. UML类图可用于描述每一个设计模式的结构以及对模式实例进行说明,而模式结构又是设 ...
- 【软件设计】UML类图怎么看
前言 无论使用哪种语言,都离不开面向过程与面向对象两个流派,而类图是面向对象程序设计中至关重要的一种软件表达形式,如何看懂类图,并设计好的软件架构,是我们作为软件工程师必不可少的技能之一. 今天小黑把 ...
- 设计模式学习笔记(详细) - 七大原则、UML类图、23种设计模式
目录 设计模式七大原则 UML类图 设计模式分类 单例模式 工厂设计模式 简单工厂模式 工厂方法模式(使用抽象类,多个is-a) 抽象工厂模式(使用接口,多个like-a) 原型模式 建造者模式 适配 ...
- UML类图的补充及软件设计原则
UML类图的补充及软件设计原则 UML 从目标系统的不同角度出发,定义了用例图.类图.对象图.状态图.活动图.时序图.协作图.构件图.部署图等 9 种图. 1.uml补充 统一建模语言(Unified ...
- (转)面向对象——UML类图设计
背景:一直以来,对UMl类图的画法不甚理解,但是随着学习的深入,发现熟练掌握UML类图,能够更好理解代码间的逻辑性,而这也是程序设计的基础所在,所以很有必要把UML好好掌握. UML类图新手入门级介绍 ...
- 18、面向对象基本原则及UML类图简介
18.1.面向对象基本原则 18.1.1.面向抽象原则 抽象类特点: a.抽象类中可以有abstract方法,也可以有非abstract方法. b.抽象类不能用new运算符创建对象. c.如果一个非抽 ...
- 设计模式学习笔记(二):UML与面向对象设计原则
1 UML 1.1 UML UML(Unified Modeling Language)是统一建模语言,1997年11月UML1.1版本提交给OMG并正式通过,成为建模语言的个那个也标准.2003年6 ...
- [.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图
[.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图 1.UML简介 Unified Modeling Language (UML)又称统 ...
- webpack环境搭建开发环境,JavaScript面向对象的详解,UML类图的使用
PS:因为所有的设计模式都是基于面向对象来完成的,所以在讲解设计模式之前先来过一下面向对象都有哪些知识点 搭建开发环境 初始化npm环境 下载安装nodejs安装即可,nodejs自带npm管理包,然 ...
随机推荐
- java: web应用中不经意的内存泄露
前面有一篇讲解如何在spring mvc web应用中一启动就执行某些逻辑,今天无意发现如果使用不当,很容易引起内存泄露,测试代码如下: 1.定义一个类App package com.cnblogs. ...
- nodejs进阶(1)—输出hello world
下面将带领大家一步步学习nodejs,知道怎么使用nodejs搭建服务器,响应get/post请求,连接数据库等. 搭建服务器页面输出hello world var http = require ...
- Shell碎碎念
1. 字符串如何大小写转换 str="This is a Bash Shell script." 1> tr方式 newstr=`tr '[A-Z]' '[a-z]' < ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- C#项目中文件的具体含义
1.Bin 目录 用来存放编译的结果,bin是二进制binary的英文缩写,因为最初C编译的程序文件都是二进制文件,它有Debug和Release两个版本,分别对应的文件夹为bin/Debug和bin ...
- springmvc+mybatis+spring 整合 bootstrap html5
A 调用摄像头拍照,自定义裁剪编辑头像 [新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单; 技 ...
- js 基础篇(点击事件轮播图的实现)
轮播图在以后的应用中还是比较常见的,不需要多少行代码就能实现.但是在只掌握了js基础知识的情况下,怎么来用较少的而且逻辑又简单的方法来实现呢?下面来分析下几种不同的做法: 1.利用位移的方法来实现 首 ...
- Spring Quartz实现任务调度
任务调度 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作 任务调度涉及多线程并发.线程池维 ...
- 技术笔记:Indy控件发送邮件
工作中有个需求需要发送邮件,因为使用的delphi6,所以自然就选择了indy组件,想想这事挺简单的.实现的过程倒是简单,看着Indy的demo很快就完了,毕竟也不是很复杂的功能. 功能要求: 1.压 ...
- 从零开始,DIY一个jQuery(2)
在上篇文章我们简单实现了一个 jQuery 的基础结构,不过为了顺应潮流,这次咱把它改为模块化的写法,此举得以有效提升项目的可维护性,因此在后续也将以模块化形式进行持续开发. 模块化开发和编译需要用上 ...