单一职责原则
就一个类而言,应该仅有一个引起他变化的原因,最简单也是最难掌握的一个原则。其中单一职责=内聚,职责=变化的原因。不同职责并非绝对不能共处,关键是发现类中变化特征不同的职责减少耦合
这个是横向的
开放-封闭原则
软件实体(类,模块,函数等)应该是可以扩展的,但是不可修改
这个是纵向的
Liskov替换原则
子类型必须能够替换掉他们的基类型
LSP是OCP的重要支撑,也是继承关系设计的基本原则,其关键在于,不能单方面的、孤立的思考设计,应多从使用者角度考虑问题,用可替换性比ISA关系更明确
依赖倒置原则
抽象不应该依赖于细节,细节应该依赖于抽象
本原则的本质是要破除看似自然的.结构化程序设计思维:逻辑高层调用底层,逻辑上的高层在设计中应处于抽象层次的低层。
a.高层模块不应该依赖于低层次模块,二者都应该依赖于抽象
b.抽象不应该依赖于细节,细节应该依赖于抽象
让客户类来声明他们需要的服务接口,那么仅当客户需要服务接口变化时才修改接口
原来的设计都是定义接口和实现接口都是一个层次的,其实定义的接口应该和客户一个层次,客户定义了服务接口,而实现服务的具体类和接口不是一个层次
接口隔离原则
不应该强迫用户依赖于他们不用的方法。接口属于客户,不属于它所在的类层次结构
接口和客户相关,所以我们要把内聚的接口放到一起 ,这样我们都面向接口访问,就会减少耦合
依赖倒置和接口分离是我在修改代码中需要重点注意的地方,因为我发现我写的代码中还是直接引用具体的类,这样就很不利于修改和重用,而且多余的接口在别的地方重用这个具体类的时候,还需要多余的一些初始化 这两个原则要重点掌握一下,只是看懂了,并没有会;单一职责原则我现在 已经掌握的比较熟练了,已经在用
command设计模式
command设计模式可以分离事件和处理事件 这样我们可以在一个固定的地方维护事件和事件的响应,这样事件和事件处理就可以各自关注自己关心的事情,比如事件只需关心什么条件会触发事件,什么情况会触发事件, 而事件处理就只关心对于这样的事件我如何处理,其他的他都不需要关注
同时command模式也可以将时间和执行分离,比如书中说的对数据的校验和对数据的处理可以分时进行,数据库白天维持不变,我们接收到数据处理的请求之后,当时就可以校验数据的有效性,如果有效我们就可以存储这个命令,等到我们能更新数据库的时候执行这个命令
command模式还能应用于绘图这样的程序中,比如我们一个命令是添加一个线段,那么我们可以将这个线段和这个command分别入栈,但是这个command可以记录这个线段,这样我们就可以进行撤销操作,我们测井程序的撤销不是这么做的,因为我们一个操作是对原始数据的修改,不是类似于绘图这样事务的添加,他们是叠加的,我们是一直保存更新前的数据,这样撤销的时候直接将被更新的数据替换,这样也有一个问题,比如一次操作的数据很多备份就会很大
还有一个利用command来设计多线程的一种处理,每次切换都是一个完整的事件
模板模式和策略模式
模板模式和策略模式 都是将高层的算法逻辑和低层的具体实现进行了分离,算法是一个整体的流程,他的流程是固定的,但是对于不同的事情他们每一步的具体细节会有差别
模板是通过继承来实现的,策略是通过委托或者组合模式实现的,模板是依赖于他们的基类,而策略模式是通过接口 后者更灵活一点
门脸模式和中间者模式
门脸模式和中间者模式都是对一组对象施加一组策略或者限制,门脸模式是从上面施加了一种可见的限制,这样外部的模块都通过这个门脸接口来访问下面的对象,这样有一个好处就是减少对外部接口的开放,对实现进行了封装,增加了对访问的集中控制
中间者模式是在底层实现了一种对外部用户不可见的策略,这样用户不用关注这个策略的实现
单例模式(singleton和monostate)和单一状态模式
单例模式是通过私有化构造函数,利用一个私有的静态指针和一个静态的公开创建函数instance来实现,这个是结构上保证是单一的
好处:可以跨平台;可以应用单例模式到任何一个现有的类;子类可以做成单例模式;可以延迟实例化(如果实例消耗资源很多,可以推迟资源开销)
缺点:如果提前销毁对象,结果会异常;不能继承,基类是单例模式,继承他的子类不是单例的;会有一定的效率消耗需要不断判断if;对客户来说不透明,必须调用instance;
单一状态是通过将变量都设置成私有静态变量,成员的函数都是非静态来实现,这样就能保证所有的类共享数据,使其行为表现看起来就像只有一个实例
好处:透明,用户并不知道这个类是单例的;可派生子类,并且子类也是单例的;多态性,由于方法不是静态的可以在派生类中覆写
缺点:不能通过派生把任意常规类转换成单例;因为不是真的只有一个实例,会带来效率的问题;
因为是静态成员变量,即使没有使用也会占用内存;不能跨平台
NULL空对象模式
空对象模式是对返回对象指针为空的特殊处理,这样我们就不必关系返回的对象是不是有效,但是有时为了判断返回是不是一个有效的对象,我们必须提供一个静态的NULL实例,这样就会用单单例模式
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!