23 种设计模式
一、设计模式的分类:
总体分为三大类:
1、创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。五种
2、结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。七种
3、行为型模式:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 十一种
还有两类分别是并发型模式和线程池模式。
二、设计模式的六大原则:
1、 单一职责原则:
定义:不要存在多以一个导致类变更的原因。也就是说一个类只负责一项职责。
在程序中,一个类承担的职责越多,它被复用的可能性就越小,而且一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中,如果多个职责总是同时发生改变则可将它们封装在同一类中。
2、 开闭原则:
开闭原则就是对扩展开放,对修改关闭。在程序需要进行扩展的时候,不能去修改原有的代码,而是扩展原有的代码。
当软件有新的需求时,程序就要发生变化,开闭原则就要求在不改变现有的代码的情况下进行扩展,使软件在拥有适应性和灵活性的同时具备较好的稳定性和延续性。
3、 里氏替换原则:
定义:所有引用父类的地方必须能透明地使用其子类的对象 。
也就是:在程序中将一个父类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用父类对象。例如:我喜欢动物,那我一定喜欢狗狗,因为狗狗是动物的子类;相反,我喜欢狗狗,不能据此断定我喜欢动物,因为我并不喜欢老鼠,虽然它也是动物。
4、 依赖倒置原则:
定义:抽象不应该依赖细节;细节应该依赖抽象。高层模块不应该依赖低层模块,二者都应该依赖其抽象。
要求在程序中传递参数时或者在关联关系中尽量引用高层的抽象类。即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明以及数据转类型的转换等。而不要用具体的类来做这些事情。
5、 接口隔离原则:
定义:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。当一个接口太大时,我们需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。每一个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干。
6、 迪米特法则:
定义:一个软件实体应当尽可能少地与其他实体发生相互作用。
迪米特法则又称最少知道原则,就是一个类对自己依赖的类知道的越少越好。也就是,对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public的方法,不对外泄漏任何信息。
- - - - - - - 接下来一 一了解这 23 种设计模式 - - - - - - -
I 、 创建模式:
A、工厂方法模式(Factory Method): 工厂方法模式分为三种:
1-1、 普通工厂模式:
建立一个工厂类,对实现了同一接口的一些类进行实例化。
1-2、 多个方法工厂模式:
此模式是对普通工厂模式的改进,在原有的模式中,如果传递的字符串出错,就不能够正确创建对象;而多个工厂方法模式是提供多个工厂方法的,能够分别创建对象。
1-3、 多个静态工厂方法模式:
是将上面的多个工厂方法模式里面的方法设置为静态的,不需要创建实例,直接调用便可。
B、 抽象工厂模式(Abstract Factory):
简单工厂模式有个问题就是类的创建时依赖工厂的,如果想要对程序进行扩展,就必须对工厂类进行修改,这违背了开闭原则。所以用抽象工厂模式创建多个工厂类,把需要增加的新功能增加到新的工厂类就可以了,并不需要修改之前的代码。
C、 单例模式(Singleton):
介绍保证一个类仅有一个实例,并提供一个访问它的全局访问点。也就是这些类只能有一个实例;能够自动实例化;对整个系统可见,也就是必须向整个系统提供这个实例。单例模式只应在有真正的“单一实例”的需求时才可使用。
D、 建造者模式(Builder):
建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。建造模式可以强制实行一种分步骤进行的建造过程。
E、 原型模式(Prototype):
该模式用于创建重复的对象,同时又能保证性能。也就是通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。当直接创建对象的代价比较大时采用原型模式。
II、 结构型模式
F、 适配器模式(Adapter):
适配器模式是两个不兼容的接口之间的桥梁。将一个类的接口转换成客户希望的另一个接口,其目的是消除接口不匹配所造成类的兼容性问题。
G、 装饰器模式(Decorator):
装饰器模式就是给一个对象动态地新增一些新的功能。也就是向一个现有的对象添加新的功能,同时又不改变其结构。就增加功能方面来说,装饰器模式相比生成子类更为灵活。
H、 代理模式(Proxy):
顾名思义,就是一个类代表另一个类的功能。代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就如一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。
I、 外观模式(Facade):
外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。它向现有的系统添加一个接口,来隐藏系统的复杂性。
J、 桥接模式(Bridge):
把事物和其具体实现分开,使他们可以各自独立的变化。它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
K、 组合模式(Composite):
组合模式又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
L、 享元模式(Flyweight):
主要用于减少创建对象的数量,目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,以减少内存占用和提高性能。它提供了减少对象数量从而改善应用所需的对象结构的方式。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。通常与工厂模式一起使用。
III、行为型模式
M、策略模式(Strategy):
策略模式定义了一系列算法,并将每个算法封装到具有共同接口的独立的类中,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。在策略模式中,一个类的行为或其算法可以在运行时更改。
N、 模板方法模式(Template Method):
在模板方法模式中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。也就是一个抽象类中,有一个主方法,再定义n个方法,可以是抽象的,也可以是实际的方法。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。
O、 观察者模式(Observer):
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。当对象间存在一对多关系时,则使用观察者模式。
P、 迭代器模式(Iterator):
迭代器模式就是顺序访问聚集中的对象,一般集合中非常常见,如果对集合类比较熟悉的话,理解本模式会十分轻松。这句话包含两层意思:一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对象进行遍历访问。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
Q、 责任链模式(Chain of Responsibility):
责任链模式有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求。但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整。
R、 命令模式(Command):
命令模式是一种数据驱动的设计模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
S、 备忘录模式(Memento):
主要目的是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。
T、 状态模式(State):
在状态模式中,类的行为是基于它的状态改变的。状态模式允许一个对象在其内部状态改变的时候改变行为。它把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。当系统的状态变化时,系统便改变所选的子类。
U、 访问者模式(Visitor):
访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。访问者模式就是一种分离对象数据结构与行为的方法,通过这种分离,可达到为一个被访问者动态添加新的操作而无需做其它的修改的效果。
V、 中介者模式(Mediator):
中介者模式是用来降低多个对象和类之间的通信复杂性。此模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。因为如果类类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改。
W、 解释器模式(Interpreter):
解释器模式提供了评估语言的语法或表达式的方式。此模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。