设计模式的真正境界,就是看懂,然后忘记。
单一职责原则
只干一件事。
这个粒度越小,就越好复用,重复代码就越少,但是代码量也越多,需要自己权衡。
里氏替换原则
子类可以扩展父类的功能,但不能改变父类原有的功能。
可以尽量减少重复作用的类,也防止调用父子类同名方法造成不同的效果。
问题:继承的层级过多,子类会很庞大,如果并不需要用父类的方法, 就很冗余。
例子:
父亲会移动,用的腿。儿子也会移动,用的车。
调用者想用腿走,但是调用儿子的移动,就会有问题。
所以要儿子实现开车方法,让调用者自己选择。
开闭原则
写新代码不改老代码。
使用抽象类,让不同的人实现不同的效果,实现扩展。
例子:
抽象类 移动
类A 实现 移动 用腿
扩展
类B 实现 移动 用自行车
调用者 自由选择A或者B
依赖倒置原则
要面向接口编程,不要面向实现编程。
使用接口类,让不同的人实现不同的,但是效果一致。
调用者调用的是接口,并不用关心实现,效果都一致。
例子:
接口类 购物方式
类A 实现 购物方式 上淘宝
类B 实现 购物方式 上京东
购物类 初始化注入购物方式类
调用者 选择不同的购物方式类注入,然后使用购物类
接口隔离原则
减少接口依赖
提供更符合需求,更具体的接口。也就是结合业务进行封装。
例子:
套餐。
用户可以点牛排、面包、面条、花椰菜、玉米。
但是所有这些都放到一个接口类里面,就很多。
可以提供,主食类、肉类、汤类。
或者 儿童套餐,双人套餐,家庭套餐。
主要是结合场景对小接口进行归类和整合。
迪米特法则
避免直接调用或直接通信。
也叫层次依赖。
从依赖者的角度来说,只依赖应该依赖的对象。
从被依赖者的角度说,只暴露应该暴露的方法。
例子:
手机类 APP类 内容类
内容类就只用依赖APP,而不用依赖手机。
还有种理解,增加了调用者负担。
也叫增加了API表面积,就是尽量让调用者少关注实现逻辑。
例子:
一个错误处理方法,有几种错误类型。
第一种写法就是提供一个类,然后你根据类内的错误类型进行判断。这样一旦类型修改了就要改调用者的代码。
第二种写法就是提供一个校验的方法,你只用调用这个方法就知道是不是错误,或者是什么错误。
合成复用原则
少用继承,多用组合
就是将代码分成块A、块B、C..
然后制造积木1就是包含以下A和B,积木2可能就是BCD。自由组合,更灵活。
总结
Go语言还是厉害的。
直接没有继承,只有结构体和包,这不就是一块一块么?
也没有纯虚类,只有接口,直接就是面向接口编程。
看完就忘掉这几个法则把,只要记住应该怎么做就好了,什么是对,什么是错,我反正是不记得什么原则对应什么的,只记得应该这样和为什么要这样。