设计模式是什么?
设计模式,简单来说就前人编程总结出来的套路
为什么要学习设计模式?
改善系统的设计,增强系统的健壮性、可扩展性,为以后需求修改作铺垫
学习设计模式之前应该知道的基础知识 - 六大原则
ps:原则是死东西,实际的需求才是真的,应该做到尽量遵守原则,但又不要给原则限死
单一职责
定义:不要存在多于一个导致类变更的原因
理解:通俗来说就是一个类只负责一项职责;譬如一个学生类,那么它就应该只包含学生相关的属性和操作而不会包含其他身份的属性和操作;但是想要每个类都做到单一职责在实际当中,就会怎大类的数量,但是这是必然的,因为很多时候不管做人还是做事都是不可以两全其美的里氏替换
子类应该可以替换掉父类并且可以做原来父类能做的事情依赖倒置
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节(实现);细节(实现)应该依赖抽象;
理解:尽量使用接口来去规范依赖,目的是增大其扩展性;如一个读取数据的类,应该使用接口来规范,因为数据可以通过很多途径获取,如网络,文本,数据库等等接口隔离(最小化接口原则 或 接口分离原则)
定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
理解:一个类不是该实现它不需要的接口,如类a需实现接口x,而x中有1,2,3这三个方法,而只有1是类a需要的,那么这是就不应该实现接口x;可以用适配器模式解决迪米特法则(最小知原则)
定义:一个对象应该对其他对象保持最少的了解
理解:类的功能不要全暴露出去,应该只暴露该类职责的基本功能即可,目的是做到类的高类聚低耦合(我们编写一个类的字段通常会用private修饰,这就是该原则的体现)开闭原则
定义:一个软件实体如类、模块、函数、类应该对扩展开放,对修改关闭(可扩展不可修改)
理解:简单理解就是,如有个线上的系统中有个功能类A,现在需要扩展该类的功能,这时正确的做法不是修改类A的源码,而是使用其他扩展的方式来去完成功能的扩展,目录是避免修改源码带来的隐患
还有就是优先考虑组合而不是继承(来自Effective java)
设计模式分类
【对象创建型模式】
* Singleton(单例模式)
* Static Factory Method(简单工厂模式)(不属于23种GOF设计模式之一)
* Factory Method(工厂方法模式)
* Abstract Factory(抽象工厂模式)
* Prototype(原型模式)
* Builder(创建者模式)
【对象结构型模式】
* Adapter(适配器模式)
* Facade(门面/外观模式)
* Proxy(代理模式)
* Composite(合成/组合模式)
* Flyweight(亨元模式)
* Decrator(装饰模式)
* Bridge(乔模式)
【对象行为型模式】
* Strategy(策略模式)
* Iterator(迭代器模式)
* Template Method(模版方法模式)
* Mediator(中介者模式)
* Visitor(访问者模式)
* Chain of Responsibility(职责链模式)
* State(状态模式)
* Interpreter(解析器模式)
* Observer(观察者模式)
* Command(命令模式)
* Memento(备忘录模式)