设计模式与重构汇总

面向对象的基本原则:

单一原则:引起一个类发生变化的原因只有一个

开放封闭原则:对于类的修改是封闭的,而对于类的扩展是开放的

依赖倒置原则:高层不依赖于底层,都应该依赖与抽象;抽象不依赖于细节,细节依赖于抽象;

里氏代换原则:子类可以代替父类出现;


继承是父类、实现是接口;
依赖是方法中的参数用到了别的类,
关联是类中的属性有别的类而且自己不维护,
组合要自己维护属性中其他类的生命周期,
聚合通过构造函数传入实例化好的对象,不再构造方法中实例化


创建型设计模式:单例模式、方法工厂模式、抽象工厂模式、建造者模式、原型模式
建构型设计模式:外观模式、组合模式、装饰器模式、代理模式、享元模式、桥接模式、适配器模式
行为型设计模式:命令模式、解释器模式、责任链模式、访问者模式、观察者模式、中介者模式、迭代模式、模版方法模式、策略模式、状态模式、备忘录模式



代码中常见的“坏味道”:
重复代码、过长的函数、过大的类、过长的参数列表、依恋情结、发散式变化、散弹式修改、数据泥团、基本类型偏执、
夸夸其谈未来性、平行继承体系、switch语句、过度的消息链、中间人、冗赘类、过多的注释、令人迷惑的暂时字段、
狎昵关系、异曲同工的类、不完美的类库、纯稚的数据类、被拒绝的遗赠


/*/*/*/**/*/*/*/*/*/*/*/**/*/*/*/*/*/*重构:
重新组织函数:(在方法中没一个临时变量只能被赋值一次,当然除了那些结果收集型的临时变量)
1.方法提炼 2.方法内联 3.局部变量内联 4.用查询替代局部变量 5.引入解释性临时变量 6.拆分临时变量 7.移除对参数的赋值(把对参数的赋值,改为对临时变量的赋值)
8.以函数对象取代函数 9.替换算法
在对象间搬移特性:
1.搬移方法 2.搬移字段 3.提炼类 4.内联类 5.隐藏委托关系(客户端通过服务对象的字段得到另一个对象,然后调用后者的函数)6.移除中间人 7.引入外加函数 8.引入本地扩展(子类或包装类)
重新组织数据:
1.Self Encapsulate Field(自封装字段) 2.Replace Data Value with Object(以对象取代数据值)
3.Change Value to Reference(以引用对象取代值对象) 4.Change Reference to Value(以值对象取代引用对象)
5.Repalce Array With Object(以对象代替数组) 6.Duplicate Observed Data(复制“被监视变量”) 7.Change Unidirectional Association to Bidirectional(将单向关联改为双向关联)
8.Change Bidirectional Association to Unidirectional(将双向关联改为单向关联) 9.Replace Magic Number with Symbolic Constant(以字面常量取代魔法数) 10.Encapsulate Field(封装字段)
11.Encapsulate Collection(封装集合) 12.Repalce Record with Data Class(以数据类取代记录) 13.Replace Type Code with Class(以类取代类型码) 14.Replace Type Code with SubClass(以子类取代类型码)
15.Replace Type Code with State/Strategy(以 State/Strategy取代类型码) 16. Replace SubClass with Fields(以字段取代子类)
简化条件表达式:
1.Decompose Conditional(分解条件表达式) 2.Consolidate Conditional Expression(合并条件表达式) 3.Consolidate Duplicate Conditional Fragments(合并重复的条件片段)
4.Remove Control Flag(移除控制标记) 5.Replace Nested Conditional with Guard Clause(以卫语取代嵌套条件表达式) 6.Replace Conditional with Polymorphism(以多态取代条件表达式)
7.Introduce Null Object(引入Null对象) 8.Introduce Assertion(引入断言)
简化函数调用:
1.Rename method(函数改名) 2.Add Parameter(添加参数) 3.Remove Parameter(移除参数) 4.Separate Query from Modifer(将查询函数和修改函数分离)
5.Parameterize Moethod(令函数携带参数) 6.Rplace Parameter with Explicit Methods(以明确函数取代参数) 7.Preserve Whole Object(保持对象完整)
8.Replace Parameter with Methods(以函数取代参数) 9.Introduce Parameter Object(引入参数对象) 10.Remove Setting Method(移除设值函数)
11.Hide Method(隐藏函数) 12.Repalce Constuctor with Factory Method(以工厂函数取代构造函数) 13.Encapsulate Downcast(封装向下转型) 14.Replace Error Code with Exception(以异常取代错误代码)
15.Replace Exception with Test(以测试取代异常)
处理概括关系:
1.Pull up Field(字段上移)2.Pull Up Method(函数上移) 3.Pull Up Constructor Body(构造函数体上移) 4.Push Down Method(函数下移) 5.Push Down Field(字段下移)
6.Extract Subclass(提炼子类) 7.Extract Superclass(提炼超类) 8.Extract Interface(提炼接口) 9.Collapse Hierarchy(折叠继承体系) 10.Form TemPalte Method(塑造模版函数)
11.Replace Inheritance with Delegation(以委托取代继承) 12.Repalce Delegation with Inheritance(以继承取代委托)
大型重构:
1.Tease ApartInheritacne(梳理并分解继承体系) 2.Convert Procedural Design to Objects(将过程化设计转化为对象设计)
3.Separate Domain fro Presentation(将领域和表述/显示分离) 4.Extract Hierarchy(提炼集成体系)



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

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

相关文章

转 最小凸包算法(Convex Hull)(1)-Graham扫描法 -计算几何-算法导论

原文地址:http://blog.csdn.net/suwei19870312/article/details/542281 基本问题: 平面上有n个点p1,p2, ..., pn, 要求求出一个面积最小的凸多边形,使得这个多边形包含所有平面上的点。 根据算法导论上提供的两个方法做一些介绍: …

Trident API 概览

Trident API 概览 在网上看到了很多有TRIDENT相关API的翻译,看来看去,总觉得没有说清楚很多东西,所以自己结合使用的经验翻译了一篇出来;翻译完以后,也发现 在自己的翻译中也有很多地方是表达不清楚的不过多少感觉有些…

poj 2406 还是KMP的简单应用

记住KMP是多计算一位的。其中next[i]为不为自身的最大首尾重复子串长度。 位移ji-next[i]可以看作是构成字符串s的字串(如果i%j0,存在这样的构成),相应的重复次数也就是n/d。 a b c d * next:-1 0 0 0 0 这时ji-next[i]; …

Trident State译文

Trident State 译文 Trident针对状态化的数据源的读写进行了一流的分装。State可以包含在拓扑中-例如,保存在内存中,有HDFS提供备份-也可以保存在一个外部的数据库中,像Memcached和Cassandra。针对以上的所有情况,Trident的API都…

远程访问数据库查询数据量一大就Hang

最近刚为客户升级了一套Oracle Database,一切进展顺利,眼看就要顺利验收时,发现有部分客户端软件连接新版本数据库时会Hang,问题非常诡异。 系统环境如下 升级前的环境OS:Windows Server 2003 DB:Windows Database Enterprise Edi…

storm-hbase jar包中的bolt节点源码解析

一段时间内,大家都是自己在storm的节点中实现对hbase的操作,不管是普通的topo还是在trident中都是这样;不知道从那个版本起,在storm的压缩包中就多出了好几个jar包,把针对habse,mysql,mongodb等…

软件之道:软件开发争议问题剖析

软件之道:软件开发争议问题剖析 基本信息 原书名: Making Software 原出版社: OReilly 作者: (美)Andy Oram Greg Wilson 译者: 鲍央舟 张玳 沈欢星丛书名: 图灵程序设计丛书出版社:人民邮…

如何理解矩阵

线性代数课程,无论你从行列式入手还是直接从矩阵入手,从一开始就充斥着莫名其妙。比如说,在全国一般工科院系教学中应用最广泛的同济线性代数教材(现在到了第四版),一上来就介绍逆序数这个“前无古人&#…

对于泛型的理解

如果希望构建一个集合容器,会用到ArrayList array new ArrayList(); ArrayList有几个缺点:1 无法保证容器中的类型安全(类型一致问题) 2 存进arralist的数据,CIL会自动进行装箱,也就是保存进ArrayList中的…

交通灯管理系统

题目需求: 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 1、异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转车辆 由东向…

REDIS提供的map,list,set,sortedset使用测试

public class RedisTest {public JedisPool jedisPool null;public void init(){//创建配置信息JedisPoolConfig pool new JedisPoolConfig();//设置最大的总链接数pool.setMaxTotal(300);//设置最大空闲链接数pool.setMaxIdle(100);//设置最大等待时间pool.setMaxWaitMilli…

Java 多线程-生产者、消费者

一、整体代码 ThreadDemo.java public class ThreadDemo { public static void main(String[] args) { Godown godown new Godown(0); Consumer c1 new Consumer(50, godown); Consumer c2 new Consumer(20, godown); Consumer c3 new Consumer(30, godown); Producer p1 …

scala初学之helloWorld

特此声明,本文中的代码 部分或全部来源王家林的scala教程;虽然王家林一直被大家所诟病,而且也无法确定这些scala的程序代码是不是他的。但是作为一个初学者觉得就算代码不是他的,他只是拿过来翻译一次,看他的视频也是能…

scala初学之函数定义、流程控制、异常处理入门

特此声明,本文中的代码 部分或全部来源王家林的scala教程;虽然王家林一直被大家所诟病,而且也无法确定这些scala的程序代码是不是他的。但是作为一个初学者觉得就算代码不是他的,他只是拿过来翻译一次,看他的视频也是能…

HGOI20190707 题解

Problem A 钢铁侠的诞生 现在有$n$个数字$a_i \leq 10^9 $,然后取出$m$个数字,保证合法。 从小到大输出剩余的$n-m$个数字。 对于100%的数据$m\leq n \leq 3\times 10^5$ Sol : 直接map映射然后用iterator来遍历整个map输出答案即可。 复杂度大概是$O(n…

scala初学之Tuple、Array、Map、文件操作入门实战

特此声明,本文中的代码 部分或全部来源王家林的scala教程;虽然王家林一直被大家所诟病,而且也无法确定这些scala的程序代码是不是他的。但是作为一个初学者觉得就算代码不是他的,他只是拿过来翻译一次,看他的视频也是能…

Java连载3-编译与运行阶段详解JRE,JDK,JVM关系

一、 1.JDK下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk12-downloads-5295953.html 二、Java的加载与执行 1.Java程序运行包括: (1)编译阶段:检查Java源程序是否符合Java语法,符…

KMP算法NEXT数组纯手工生成

用一个实际的例子来说明,经历了看懂,看不懂,看懂,看不懂,看懂...后我终于决定把它记下来了。 例子字符串为:abaabaca 首先可以肯定,第一个位置永远位0,第二个位置永远为1.那么可以…

P1078 文化之旅

题面 这题好像是初二时老师讲过的一道题,但是。。我没听??反正没交过就对了。。 我本来想的是深搜spfa,写到50行实现不了??果断看tj,floyd???(黑人…

KMP算法中NEXT数组的作用以及代码实现

在http://blog.csdn.net/u012613903/article/details/79004094中写到了如何手工去求一个NEXT数组,这个在很多考试中可以用来解题。但是在实际的使用中,NEXT数组究竟发挥着什么样的作用,如何用代码实现KMP算法呢? KMP算法是用来确…