设计模式-纲领篇
在经历了很多次学习,很多次放弃,就在现在开始另外一次的学习放弃设计模式的过程。
对于设计模式的实现上面是不依赖于编程语言的,设计模式是一个思想。
参考文章: Java之美[从菜鸟到高手演变]之设计模式
一、设计模式的分类
总体来说设计模式分为三大类
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式
行为型模式,共十一种:策略模式、模版方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
二、设计模式的六大原则
1、开闭原则
简单来说就是:对扩展开放,对修改关闭;
在程序需要进行拓展的时候,不能修改原有的代码,实现一个热插拔的效果。为了使程序的扩展性好,易于维护和升级,我们使用接口和抽象类。
2、里氏替换原则
里氏替换原则是面向对象设计的基本原则之一。任何基类可以出现的地方,子类一定可以出现。只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能正真的被复用,而衍生类也能够在积累的基础上增加新的行为。里氏替换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的集体实现。
20241114补充
补充对定义的理解:作者:liskov, 就是说继承必须确保超类所拥有的性质在子类中仍然成立;子类可以扩展父类的方法,但是不能修改父类的方法,比如我们用java的List来举例说明,一个类继承List, 重写get方法,当传入的index大于列表的大小的时候, 我应该抛出IndexOutOfBoundException, 不应该有其他的动作。
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable{
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
private void rangeCheck(int index) {
if (index >= size)
// ArrayList的源代码抛出IndexOutOfBoundExection错误
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
}
public class CustomList<T> extends ArrayList<T> {
@Override
public T get(int index) {
if(index >= size()){
// 返回null,这样父类get()和子类的get()的行为就不一样了
return null;
}
return get(index);
}
}
3、依赖倒转原则
这个是开闭原则的基础,具体内容是:针对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则
使用多个隔离的接口,比使用单个接口要好。降低类之间的耦合度的意思。
5、迪米特法则(最少知道原则)
一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则
原则是尽量使用合成/聚合的方法,而不是使用继承。