设计模式学习

所有的设计模式都是为了解决变化的问题,通过一定的模式来应对变化,变化应对的原则是开放封闭原则,对修改封闭,对扩展开放。

为了应对变化,就会添加相应的层次,层次越多,代码的颗粒就越小,那么代码就越复杂。

所以设计时考虑变化和复杂之间的取舍,为了应对变化 ,需要使用模式,但是又不可以一味应用模式,导致代码太复杂。

应该是根据软件可能的变化部分使用模式应对变化。


里氏代换原则:子类型必须能够替换掉它的父类型,is a关系。

A 策略模式 

现实模型:不同的实现部分,但是他们的对外接口是一样的。

设计模式:抽象多一层,外部只调用基类,不调用具体的策略类。


B 合成模式 

现实模型:数据是树型结构,而且树节点之间存在整体和部分的包含关系。

设计模式:将树节点的树枝和树叶同等对待,他们具有一样的基类。

这样就可以很容易的生成任何类型树结构。


C 代理模式

现实模型:外部希望访问真实的对象,但是设计者因为各种原因,可能性能或者安全考虑,让一个代理和外部打交道,我们现实也经常有代理,委托某个人帮助实施部分功能。

设计模式:代理和真实对象存在关联,然后他们继承一样的基类,那么就对外有统一的功能,


结论:里氏代换原则实现方法都是一样的,就是继承同样的基类,然后外部通过和基类打交道,基类就是这个中间层次,只要基类不变化,那么就可以保存对外接口不变化。

通过添加基类,对修改封闭,对扩展开放。

上面3个现实的模型是不一样的,策略之间对等关系,合成是整体和部分关系,但是把他们对等看待,代理模式是关联关系,但是对外他们是对等关系。


要是现实模型的AB不满足里氏代换原则,就算B不is a A ,那么这个时候如何解决他们的关系的呢?

A 添加 基类C,让他们同时继承C

正方形和长方形的例子,正方形不是长方形,通过引入C 四边形解决。

B 继承关系改为委派关系


依赖倒转原则:A 高层不应该依赖低层,两个都应该依赖抽象。

                            B 抽象不应该依赖细节,细节应该依赖抽象。

A 工厂方法

现实模型:外部需要调用一个对象,需要new一个对象,依赖于具体对象。

设计模式:添加一个工厂类,将这个类的实例化延迟到之类,外部就是依赖抽象,而不依赖具体类型。


B 模板对象

现实模型:两个东西,大部分是一样的,但是有些细节不一样,那么将公共部分抽象为模板,不同播放延迟到子类实现。

设计模式:抽象公共部分为基类,定义接口虚函数,延迟到子类实现。


C 迭代器模式

现实模型:需要迭代功能。只是迭代的类型不一样。

解决办法:统一基类迭代器,具体迭代接口函数在具体子类实现。


依赖倒转原则,创建类的时候要不依赖具体,那么就要创建工厂类,麻烦。同时依赖倒转假设具体类是被修改的也是不总正确的 ,所以就是要合理使用。


接口隔离原则:应该给客户端提供尽可能小的接口,而不要提供大接口。

合成聚合复用原则:要尽量使用合成聚合,而不要使用继承。

区分Has-A 和Is -a  ,Is  -A 表示一个类是另一个类的一种。Has-A表是某一个角色具有某一项职责。

Has-A用关联,Is-A用继承。

迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应发生直接的相互作用,如果其中一个类需要调用另一个类的某个方法,就通过第三者转发这个调用。


说白了就是模块化设计,高内聚,低耦合。

高内聚:单一职责原则。

低耦合:迪米特法则  接口隔离原则 依赖倒转原则    


目的是对修改封闭,对扩展开放。


代码复用:封装,继承 。

通过抽象封装,继承,是代码可以服用。

封装的原则是:高内聚, 单一职责。


适应变化:多态机制,添加层次。

通过运用多态和添加代码层,可以让代码适应变化。

层次的原则:低内聚,迪米特法则  接口隔离原则 依赖倒转原则    





软件要易于维护和适应变化,一个复用率好的系统就是一个容易维护的系统,一个适应变化的系统是对修改封闭对扩展开发的系统。

所以代码设计的原则是复用和适应变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值