设计模式

简介:有了SOLID五大原则,那么因此遵循五大设计原则又延伸推出了响应的23种设计模式。所谓的设计模式,就是用来解决某种特定的业务场景。在不同的业务场景中,选择合适的设计模式,可以很好的解决问题的复杂性。使得程序可以很好的维护和扩展。(注意:我们不能为了模式而模式,不要为了使用某种模式,而将这个谋士硬套在当前的这个业务中。而是应当依据当前的业务场景选择合适的设计模式才是王道。)

一:单例模式

1)描述:在程序的运行期间保证这个类只会创建一个对象,这个就是单例模式。意思也就是,不管创建多少个这个类的实例,返回的都是同一个引用。

2)单例有两种创建方式

懒汉式:需要的时候才创建

饿汉式:预先创建好

二:工厂模式

描述:工厂模式也是属于创建型的设计模式,它的职责非常明确,就是负责创建产品,也就是专门负责对象的创建,因此叫做工厂,在工厂模式中主要分为以下几种型:

1)简单工厂

就是负责对象的创建,但是当产品不固定的情况下,简单工厂就不能满足需求,也就是工厂类会随着对象的增多而不停的修改,违背开闭原则。

2)工厂方法

工厂方法的目的就是为了解决上述问题而提出的,它将工厂划分的更加精细,也就是每一种产品对应一种工厂。

3)抽象工厂

工厂方法很好的解决开闭原则,但是,随之的另一个问题也产生了。当需要的产品不是一个类型的时候,这时工厂方法就无法解决这类问题。随之又恒生出了抽象工厂。抽象工厂的目的就是为了解决产品族的问题(同一系列不同类型的产品)。抽象工厂是可以生产同一系列不同的产品,但是抽象工厂一样存在违背开闭原则的问题。

4)万能工厂

简单工厂+反射=万能工厂

5)容器工厂

容器工厂是在万能工厂之上的一种升华

三:策略模式

1)描述

在开发的过程中,通常有些业务会有多种实现方式,而且在程序的运行时,会根据当前的业务场景选择合适的实现,这种情况就适合使用策略模式。策略模式的特点就在于“多选一”的情况。

2)策略模式中有一个重点就是:策略上下文,这个上下文其实就是已含了一个简单的工厂,根据不同的要求创建不同的实现类实例,并且把实现类的具体行为进行封装。因此客户端在调用的时候只面对这个上下文,而不需要知道具体哪些策略在执行。

注意)策略模式中隐藏一个简单的工厂。

四:责任链模式

1)描述:

责任链模式是一种线性的执行流程,多个对象都有机会去执行同一个任务,只是在执行过程中,由于执行的过程和范围不一样,那么当自己不能处理此任务时,就必须将这个任务抛给下一个执行者,以此类推,就形成了一个执行链。

2)典型的例子就是tomcat中的过滤器,当配置了多个过滤器时,就形成了一个过滤链,客户端发起的请求会经过这个过滤链的每一个过滤器,但最终只有一个过滤器去处理这个请求。

3)纯与不纯的责任链

1)纯的责任链就是在整个链条中,只有一个对象去处理这个任务,而不是某个对象处理了一半,然后交给下一个执行者。

2)纯的责任链中必须要有一个对象去处理这个任务或请求,不会出现链中没有对象处理此任务或请求的情况。

总结:通常在实际的开发场景中,多数会出现不纯的责任链模式。其实这也是责任链模式的一种改变,为了迎合业务需求。不纯的责任链并不是说违反这个设计模式和原则。

五:模板方法

1)描述:当一个任务被抽象分解成多个有序的子任务或步骤时,这种场景就特别适合使用模板方法模式,模板方法利用了继承的优点产生的。并且每个子任务或步骤实现的方式不一样,他们被延迟到子类中去实现。但是在父类中有一个行为去统筹这些子任务或步骤的执行顺序,而这个行为就是模板方法。

2)特点:

1)多个子任务有序的执行

2)子任务在子类中有不同的具体实现

3)在父类中提供统一执行的方法

六:观察者模式

1)描述:定义的两个对象之间是一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象将得到通知,并自动执行更新。(摘自Hand First 设计模式)

Swing中的事件驱动模型就是典型的观察者模式。

2)关键角色:

1)(Subject)主题

抽象的主题以及具体实现的主题

2)(Observer)观察者

抽象的观察者以及具体的观察者实现类


主题和观察者之间是一种一对多的关系,一个主题可以同时对应多个观察者,多个观察者可以同时关注同一个主题。


3)消息的发布订阅模式

关键角色

1)消息队列(存放消息和定制主题的核心)

2)消息的发送方(发布消息的人,发布的消息会存放在消息对列中)

3)消息的接受方(接受消息的人,从消息队列中取出消息,进行消费)

七:代理模式

1)Aop(面向切面编程)

它是面向对象的一种补充或者是一种增强,它在这基础之上增加了一些额外的功能增强。它可以在原有的行为不改变的前提,在这之前或者之后完成一些额外的事情。而Aop用的思想和模式就是代理模式。

代理模式分为两种:

1)静态代理:

静态代理的代理对象是开发人员自行编写好的,并且在编译期就已经确定。编写相应的接口和实现类,同时编写一个代理类实现这个接口。

缺点:

1.需要为不同的目标对象编写相应的代理实例,从而代理不同的业务逻辑。

2.当接口发生变动时,所有的代理类和实现类都必须修改。

2)动态代理

使用动态代理,代理实例是不需要开发人员去编写的,而是有相应的处理程序在运行时动态产生一个字节码,这个字节码就是代理对象,并加载到JVM中去执行。由于代理实例是在运行时才会动态产生的,因此就叫做动态代理。它和静态代理的区别就在于,静态代理的实例是人为编写的,并且是在编译期就已经确定的。

在Java语言层面实现动态代理的机制有很多,例如:

Jdk动态代理(官方)

1)Proxy类,用于动态产生代理对象

2)InvocationHandler接口,回调处理器,负责调用目标对象的行为,并实现功能增强。

Jdk动态代理有一个特点,就是被代理的对象必须要有实现的接口,如果没有接口是实现不了代理的。

CGLIB动态代理(第三方开源)


你可能感兴趣的:(设计原则)