二十三种设计模式(白话版)
tips:作者以尽量精简的语言让大家得到对二十三种设计模式的理解,但是对于这些设计模式,还是得多敲多看代码才能领悟其中的精髓!
======================================================================
一、设计模式的分类
总体来说设计模式分为三大类:
创建型模式,顾名思义:把new的过程交给第三方来帮忙创建!共五种:
工厂方法模式:A、B类交给C类创建,C类按条件去new他们.
抽象工厂模式:A、B类均有对应的工厂类去创建,而工厂类实现自同一接口!优点:当有C类加入时,只需要再增加一个工厂类,扩展性强!
单例模式:在内存中只存在一个对象,1.恶汉式:在调用时已经new好,2.懒汉式:访问才加载,为了避免多线程问题需要加锁!
建造者模式:增强版工厂,可以建造更复杂的对象、控制个数,eg:需要A类1个、B类4个,此时运用建造者模式更妥!
原型模式:简而言之就是克隆,A类就是实现Cloneable接口的clone方法调用super.clone(this)便可以实现浅拷贝,也可以实现Serializable接口将this用流的方式进行深拷贝!
深浅拷贝传送门
======================================================================
结构型模式,共七种:
适配器模式:
问题:A类中的B方法返回值是C类,一个接口D的E方法的入口是F类?
答:此时,创建一个G类(适配类)继承A类的实现D接口,得到了A的方法,也能实现D的方法!适配器就像转接口把二项转成三项接入!
装饰器模式:A类被装饰者,B类持有A类引用,B类能在A类调用方法前后做一些事情,并且能够动态取消这些事情,返回A类对象。此时A类对象已经被装饰过了!
代理模式:这个模式大家并不会陌生,proxy代理对象持有A的引用,并在A调用方法前后做事情,并返回A对象。感觉跟装饰者模式没区别?有什么不一样请大神指点指点。
外观模式:一个调用过程需要A、B、C三个类,ABC又会相互持有对方,这时候,不如用D类持有ABC三个类,既能降低ABC的耦合程度,又能将过程统一归类!
桥接模式:A、B、C均继承D接口,此时就可以用E类来承接D接口,并且做一些均有的特性。通过放入的实现类的不一样,就可以调用不用的具体实现方法!
组合模式:目标A.B两类,C类持有A.B类引用,所以C为组合类!
享元模式:共享池,A类维护一个List,当使用B时,直接在A类取,用完还能放回去!
======================================================================
行为型模式,共十一种:
策略模式:A.B.C三类均实现了D接口,用户可以根据喜好,选择不同的类,只要NEW不一样的就OK,接口都是一样的!
模板方法模式:抽象类A实现了B方法,并且在B方法调用了C方法(未实现),实体类D继承A重写C方法,调用方只要调用B方法边可以根据抽象类A的B模板方法去调用具体实现类的C方法!
观察者模式:类似监视的功能,当具体类A操作的时候,调用相应的观察者接口B。
迭代子模式:类似集合迭代器,区别就是新建类B迭代器来入口就是集合A,而集合是使用内部类去实现!
责任链模式:A.B.C相互引用,最后调用者不知道谁调用谁,不知道这个过程,所以用D类持有A.B.C的接口类,提供get,set和相应的方法,所以只要new D类,并将要调用的类set进去并调用就可以得到调用顺序。
命令模式:将请求和执行者解耦,执行者A类,B类持有A类对象实现C命令行接口拥有D方法可以生成命令行到具体的类中,E类具体执行者持有C类接口引用,调用其具体方法!具体:new A类,new B类并将A类set进去,new E类,执行方法!命令可以有很多种,调用方法也可以很多!
备忘录模式:目标类A,在类B中持有A引用。当想恢复时,直接去B类中还原A。
状态模式:红灯A,绿灯B,均继承一个接口C,类D持有接口C提供set,get方法,此时只要new A,B,D,就可以在类D中为所欲为了。
访问者模式:目标类A,类B中C方法有A的入口,放入A就能调用A的方法,适合不改变A类的场景!
中介者模式:目标A.B,类C持有A.B引用,并能实例化,调用响应方法进行工作!类C只是提供A.B的工作.
解释器模式:比如正则表达式的解释器!
======================================================================
二、设计模式的六大原则
1、开闭原则
开闭原则就是说对扩展开放,对修改关闭;想要达到这样的效果,我们需要使用接口和抽象类。
2、里氏代换原则
任何基类可以出现的地方,子类一定可以出现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
3、依赖倒转原则
真对接口编程,依赖于抽象而不依赖于具体。SPRING的DI
4、接口隔离原则
使用多个隔离的接口,比使用单个接口要好。
5、迪米特法则(最少知道原则)
一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则
原则是尽量使用合成/聚合的方式,而不是使用继承。