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