一句话评论设计模式六大原则

注:转自http://blog.csdn.net/jesse621/article/details/7216331

原则,故名思议则是本质的意思。所谓擒贼先擒王,研究设计模式自然要先了解设计原则,所有的模式都是在这些原则的基础之上发展起来的,有的是侧重一 个,有的是多个都有所涉及。看完设计模式之后,我感觉到每个模式都有这些原则的影子,还渗透着面向对象的三大属性,也觉得这些原则也都有相通之处,,正是 有了他们才使我们由代码工人转为艺术家。下面我来点评一下六大原则,望各位拍砖:

 

1、单一职责原则(Single Responsibility Principle,简称SRP)
      单一职责原则,就一个类而言,应该仅有一个引起它变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者一直 这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。而软件设计真正要做的许多内容,就是发现职责,并把这 些职责相互分离。

      一句话点评:高内聚低耦合的绝佳体现,不要乱拉关系,独善其身挺好。

 

2、 开放--封闭原则(The Open-Closed Principle,简称OCP)
       开放--封闭原则,是说软件实体(类、模块、函数等等)应该可以扩展,但是不可以修改。即对于扩展是开放的,对于更改是封闭的。 我们不可能做到未卜先知,在设计的时候尽可能让一个类足够好,设计好了就不要去修改了;不能完全封闭的情况下,当发生变化时,我们就创建抽象来隔离以后发 生的同类变化。

      一句话点评:开放扩展,封闭更改,开合有度是一门艺术。

 

3、依赖倒转原则(Dependence Inversion Principle )
      依赖倒转原则,指高层模块不应该依赖低层模块,两个都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象。说白了就是要针对接口编程,不要对实现编程。 举个例子:计算机硬件中,如果内存坏了,那么只需要换一个内存条就可以了,而不需要去换一个主板,在这里内存是一个接口类,只要符合他的规格要求就行,无 论是那一根。

     一句话点评:搞建筑时要做设计师,而不是砖瓦工,抽象的蓝图要靠具体的材料一点点实现。

 

4、里氏代换原则(Liskov Substitution Principle,简称LSP)
     里氏代换原则,子类型必须能够替换掉他们的父类型。在软件里面,把父类都替换成其子类,程序的行为不会发生变化。正是由于子类型的可替换性才使得使用父类型的模块在无需修改的情况下就可以扩展。

     一句话点评:长辈给了你继承的权利就一定要做赡养的义务,把长辈的职责都要承担起来。

 

5、迪米特法则(Law of Demeter
      迪米特法则,如 果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法时,可以通过第三者转发这个调用。类之 间的耦合越弱,就越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。 主要是强调了类之间的松耦合。

     一句话点评:不要和陌生人说话,若两国交战要尽量避免正面冲突,多派使者协商调度。

 

6、合成/聚合复用原则(Composition/Aggregation Principle],简称CARP)
     合成聚合复用原则,尽量使用合成/聚合,尽量不使用类继承。合成聚合是“has  a”的关系,而继承是“is  a”的关系。由于继承是一中强耦合的结构,父类变,子类必变。所以不是“is  a”关系,我们一般不要用继承。优先使用合成聚合复用原则,有助于保持每个类的封装,降低继承的层次。
     一句话点评:优生优育,不要盲目繁衍。

转载于:https://www.cnblogs.com/baronwen/archive/2012/05/11/2496599.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Big GAN

参考文献: •https://github.com/kayamin/DR-GAN •https://www.jianshu.com/p/4ee8f9284b81 •http://cvlab.cse.msu.edu/pdfs/Tran_Yin_Liu_CVPR2017.pdf •https://arxiv.org/abs/1809.11096 •https://juejin.im/entry/5c05e76c51882539c60cf2d5 •https:…

时间复杂度空间复杂度怎么算?

什么是算法 算法的定义是这样的:解题方案的准确而完善的描述,是一系列解决问题的清晰指令。巴拉巴拉的,虽然是一小句但还是不想看(题外话:有时候吧专业名词记下来面试的时候还是挺有用的),其实…

什么样的知识,值得我们终生学习

#什么样的知识,值得我们终生学习? 原文:https://dwz.cn/vylyXXJi 一、引言 可能你从初中就开始抱怨:我学相似三角形能干什么?阿伏伽德罗常数有什么用?我一不跳楼,二不高空抛物,学自由…

美团面试题:Hashmap的结构,1.7和1.8有哪些区别,深入的分析

(一) 真实面试题之:Hashmap的结构,1.7和1.8有哪些区别 不同点: (1)JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法,那么他们为什么要这样做呢?因为JDK1…

作品展结束了,学习才真正的开始

我的作品展旅程分为两个大的部分。 一、班里的事务(这是最重要,也最为艰巨的。) 从4月15号自考结束后,开始真正进入作品展的筹划阶段。主要和唐欢负责作品的筛选工作,由于我工作经验有限,能力更是有限&…

数据结构第一章概论习题及答案

一、名词解释 1.数据表示 2.数据处理 3.数据 4.数据元素 5.逻辑关系 6.逻辑结构 7.结构 8.运算 9.基本运算 10.存储结构 11.顺序存储结构 12.链式存储结构 13.索引存储结构 14.散列存储结构 15.算法 16.运行终止的程序可执行部分 17.…

管理学习笔记(1)——高效团队的五大关键

高效团队的五大关键1. 安全感:敢于冒险,不会因此干到不安 2. 可靠性:指望他人可以准时完成高质量的工作 3. 结构与清晰度:目标、角色和执行计划都很清楚、明确 4. 工作意义:对各自来说做意义重大的工作 5. 工作影响…

算法导论-用于不相交集合的数据结构

21.2-4 对于图21-3中操作序列的运行时间,给出其紧确的渐近界。假定采用的是链表表示和加权合并启发式策略。 解:make-set,O(n);加权合并启发,每次将较短链表链接到较长链表,即每次将长度为1的集合链接到另外…

大数据技术之 Kafka (第 3 章 Kafka 架构深入 ) Kafka 消费者

3.3.1 消费方式 consumer 采用 pull(拉)模式从 broker 中读取数据。 push(推)模式很难适应消费速率不同的消费者,因为消息发送速率是由 broker 决定的。 它的目标是尽可能以最快速度传递消息,但是这样很…

最活跃FPGA论坛推荐社区

http://forums.xilinx.com/ Xilinx User Community Forums(Xilinx用户交流社区)http://www.openhw.org/ 中国首个开放源码硬件社区http://xilinx.eetrend.com/ 电子创新网赛灵思中文社区http://bbs.elecfans.com/forum.php 电子发烧友社区(电子技术论坛)…

大数据技术之kafka (第 3 章 Kafka 架构深入 ) offset讲解

新版的 Kafka 使用一个选举出来的 controller 来监听 zookeeper,其他 node 再去和 controller 通信,这么做的目的是为了减少 zookeeper 的压力。bootstrap-servers 会自动发现其他 broker,这也是 bootstrap 的含义 前面我们讲到了消费者&…

创建线程的三种方式

第一种,用Thread子类创建 Thread thread new Thread(){ Overridepublic void run() {while(true){try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("1---->" Thread.currentThread().getName())…

大数据技术之kafka (第 3 章 Kafka 架构深入 ) 消费者组案例

1)需求:测试同一个消费者组中的消费者,同一时刻只能有一个消费者消费。 2)案例实操 (1)在 backupo01、backupo02 上修改/usr/local/hadoop/kafka/kafka_2.12-2.4.1/config/consumer.properties 配置 文件…

Easyui弹出窗口在iframe中弹出被当前iframe遮罩的问题(解决方法)

例如我们点击一个按钮&#xff0c;然后弹出我们需要的Window控件窗口。 1 //点击按钮2 var _testWindow window.top.$(testWindow);3 $(#testButton).click(function(){4 if(_testWindow.length < 0) {5 _testWindow window.top.$("<div idtestWin…

JDK1.8中String类的intern()方法学习

jdk1.8字符串常量池是位于堆中&#xff1b; 在jdk1.8中使用如下指令时会同时在堆中和常量池&#xff08;前提是常量池中还没有该对象&#xff09;中创建字符串对象&#xff0c;但是s是指向堆中。 String s new String("HELLO"); 如下方法会判断常量池中是否存在s,…

sfs2x 连接 mongodb

void initMongodb() {Mongo mongo;try {trace("\ninitMongodb\n");mongo new Mongo("localhost", 10011);DB db mongo.getDB("yourdb");// 从Mongodb中获得名为yourColleection的数据集合&#xff0c;如果该数据集合不存在&#xff0c;Mongodb…

大数据技术之kafka (第 3 章 Kafka 架构深入 ) 高效读写数据

1&#xff09;顺序写磁盘 Kafka 的 producer 生产数据&#xff0c;要写入到 log 文件中&#xff0c;写的过程是一直追加到文件末端&#xff0c; 为顺序写。官网有数据表明&#xff0c;同样的磁盘&#xff0c;顺序写能到 600M/s&#xff0c;而随机写只有 100K/s。这 与磁盘的机…

设计模式参考博客

http://www.cnblogs.com/zhenyulu/category/6930.html 吕震宇的博客园&#xff0c;关于设计模式介绍的比较全面。很值得学习的博客转载于:https://www.cnblogs.com/wangzihao/archive/2012/05/23/2514485.html

大数据技术之kafka (第 3 章 Kafka 架构深入) Zookeeper 在 Kafka 中的作用

Kafka 集群中有一个 broker 会被选举为 Controller&#xff0c;负责管理集群 broker 的上下线&#xff0c;所有 topic 的分区副本分配和 leader 选举等工作。 Controller 的管理工作都是依赖于 Zookeeper 的。 以下为 partition 的 leader 选举过程&#xff1a; Leader选举流…

SQLServer优化二

建立合理的索引,避免扫描多余数据&#xff0c;避免表扫描&#xff01;几百万条数据&#xff0c;照样几十毫秒完成查询。关于SQL查询效率&#xff0c;100w数据&#xff0c;查询只要1秒&#xff0c;与您分享&#xff01; 查询效率分析&#xff1a; 子查询为确保消除重复值&#x…