本文一起看下面向对象的设计原则和GOF 23 种常用的设计模式。
面向对象设计原则可以简单的总结为SOLID,分别看下。
single responsibility principle,单一职责原则,即一个类只干一件事。这样做的好处是,便于后期的维护,修改某个功能,不会影响到其他的功能。
open close principle,开放关闭原则,即对修改关闭,对扩展开放。如果需要修改的话,可以通过子类,装饰等方式来实现。最典型的就是模板方法设计模式。
liskov substituion principle,里氏替换原则,如下图:
这里的类A,类B,类C,任何一个替换另外一个,最终的行为都是一致的,这里的核心点是行为
是什么?个人理解行为包括如下内容:
1:符合基类定义的在什么场景下抛出什么异常
2:符合基类定义的在什么场景下返回什么值
3:符合基类定义的在什么场景下执行什么操作
对于1比如List接口的get方法关于异常进行了如下的定义:
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException if the index is out of range
* (index < 0 || index >= size())
*/
E get(int index);
即当index超出范围时抛出IndexOutOfBoundsException,对于子类ArrayList,和LinkedList实现如下:
// ArrayList java.util.ArrayList#rangeCheck
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
// LinkedList java.util.LinkedList#checkElementIndex
private void checkElementIndex(int index) {
if (!isElementIndex(index))
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
所以对于代码List list = new ArrayList, 以及List list = new LinkedList在index超出范围时的行为
是一致的,都是抛出IndexOutOfBoundsException,但是如果定义了如下的子类:
class CustomList extends ArrayList {
@Override
public T get(int index) {
if (index >= size)
throw new UnsupportedOperationException();
// other operation
}
}
CustomList在index超出范围时不是抛出IndexOutOfBoundsException,而是抛出UnsupportedOperationException,这就破坏了基类的定义了,也就不符合里氏替换原则了。
interface segregation principle,接口隔离原则,接口定义的要独立,不能有重合的部分,如Lambda定义的相关接口。
dependency inversion principle,依赖倒置原则,编程时要依赖于抽象,而非依赖于具体实现,这样做的好处是,程序不需要绑定到某个具体的实现类上,这样当业务变更,程序的改动更加容易(或程序本身就不要修改)。
GOF全称是gang of four,即四个小伙伴,就是下边这四个人:
gof 23种设计模式按照类型可以分为3类,创建型,结构型,行为型。分别看下。
创建型,顾名思义,就是用来创建对象的相关设计模式。创建型的设计模式一共5中,如下:
1:工厂方法 factory method
2:抽象工厂 abstract factory
3:建造者 buidler
4:原型 prototype
5:单例 singleton
分别看下。
参考这篇文章 。
参考这篇文章 。
参考这篇文章 。
参考这篇文章 。
参考这篇文章 。
结构型,顾名思义,就是用来组织对象的结构的设计模式。
参考这篇文章 。
参考这篇文章 。
参考这篇文章 。
参考这篇文章 。
参考这篇文章 。
参考这篇文章 。
参考这篇文章 。
参考这篇文章 。
参考这篇文章 。
行为型,顾名思义,就是用来控制对象的行为,控制其工作的方式的设计模式。
参考这篇文章 。
参考这篇文章 。
参考这篇文章 。
参考这篇文章 。
参考这篇文章 。
参考这篇文章 。
参考这篇文章 。
参考这篇文章 。
参考这篇文章 。
细说 里氏替换原则 。
永不磨灭的设计模式 。