热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

###设计模式:六大原则

对设计模式的一些整理。#@author:gr#@date:2015-11-13#@email:forgerui@gmail.com依赖:一种模型元素之间

对设计模式的一些整理。

#@author:       gr
#@date: 2015-11-13
#@email: forgerui@gmail.com
  1. 依赖:一种模型元素之间的关系的描述。例如类A调用了类B,那么我们说类A依赖于类B。

  2. 耦合:一种模型元素之间的关系的描述。例如类A调用了类B或类B调用了类A,那么我们说类A与类B有耦合关系。

  3. 耦合度:模型元素之间的依赖程度的量化描述。

  4. 控制:一种模型元素之间的关系的描述。例如类A调用了类B,那么我们说类A控制类B。

一、六大原则

1.1 单一职责原则 ****
类的职责要单一,一个类只做一个工作。

1.2 里氏替换原则 ****

在接受基类对象的地方必然可以透明地接受一个子类对象。

1.3 依赖倒置原则 *****

高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。

解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。

A --> B
A --> C
A --> I B => I C => I

在实际编程中,我们一般需要做到如下3点:

  • 低层模块尽量都要有抽象类或接口,或者两者都有。
  • 变量的声明类型尽量是抽象类或接口。
  • 使用继承时遵循里氏替换原则。

依赖倒置原则的核心就是要我们面向接口编程,理解了面向接口编程,也就理解了依赖倒置。

1.4 接口隔离原则 **

客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

1.5 demeter法则 ***

lonely demeter,是宙斯的妻子,因为女儿被波塞冬掳走,变得性格孤僻。
一个对象应该对其他的对象保持最少的了解,最少知识原则。

1.6 开闭原则 *****

对修改关闭,对扩展打开,即在原有基础上去扩展其功能。

1.7 合成复用原则 ****
尽量多使用组合和聚合关系,少用继承关系。

UML类图几种关系

1. 泛化(Generalization)

是一种继承关系,它指定了子类如何特化父类的所有特征和行为例如:老虎是动物的一种.

泛化

2. 实现(Realization)

【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现

实现

3. 关联

【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子。

关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。

image

4. 依赖(Dependency)

【依赖关系】:是一种使用的关系,所以要尽量不使用双向的互相依赖。
【代码表现】:局部变量、方法的参数或者对静态方法的调用

image

5. 聚合(Aggregation)

【聚合关系】:是整体与部分的关系.如车和轮胎是整体和部分的关系.
聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
【代码体现】:成员变量

image

6. 组合(Composition)

【组合关系】:是整体与部分的关系.,没有公司就不存在部门 组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期
【代码体现】:成员变量

image

7. 总结

各种关系的强弱顺序:
泛化= 实现> 组合> 聚合> 关联> 依赖

下面这张UML图,比较形象地展示了各种类图关系:
image

Reference

  1. http://blog.csdn.net/hguisu/article/details/7571617
  2. http://blog.csdn.net/tianhai110/article/details/6339565

推荐阅读
  • python oj刷题网站_中小学计算机竞赛去哪里刷题?橙旭园OJ系统上线啦!
    原标题:中小学计算机竞赛去哪里刷题?橙旭园OJ系统上线啦!相信许多人在学习完编程之后都会茫然,感觉自己无所不能࿰ ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 【编程语言之Go介绍与环境安装】
    Go语言是谷歌2009发布的第二款开源编程语言。Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。  ... [详细]
  • 这期内容当中小编将会给大家带来有关如何在php表单中使用正则表达式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可 ... [详细]
  • 开发笔记:里氏替换原则
    本文由编程笔记#小编为大家整理,主要介绍了里氏替换原则相关的知识,希望对你有一定的参考价值。1.定义:如果对每一个类型为T1的对象o1,都有类型为T2的对象o2, ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • linux location root访问文件夹404_Linux下yum安装PHP7.2+Nginx+Mysql
    一.安装NGINX1.先查看是否安装了第三方软件库:yumlistinstalled|grepepel-release或rpm-qepel-release如果已经安装 ... [详细]
author-avatar
丝兰郁香
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有