设计模式---使用场景

/ 默认分类 / 0 条评论 / 2166浏览

设计模式要干的事情就是解耦。

一、工厂模式

根据不同参数,创建不同但类型相关的对象。调用者不必在乎对象的创建,使对象的创建和使用相分离。 类型相关:Class存在共同父类、实现同一interface。


二、创建者(Builder)模式

创建者模式通过设置不同的可选参数,“定制化"的创建复杂的对象。

复杂的对象:

  1. 不可为空的属性过多,且创建情况多的对象。
  2. 属性之间存在约束关系,且创建情况多的对象。

以上存在验证逻辑难以复用的情况。如果采用建造者模式,即可在build()方法中集中验证约束逻辑。

还有个特殊的情况也适合创造者模式:创建出来的对象属性不再可变,也不希望自己在编码中误操作,那么在创建时直接通过属性赋值的方式创建,隐藏掉所有set()方法。


三、原型模式

通过已有的对象进行复制(copy,clone,拷贝)的方式创建新对象,以达到节省创建时间的效果。 创建成本大,且实例化的对象之间差别不大(寥寥几个字段不一致)的情况,适合原型模式。

需要考虑浅拷贝的引用问题,改了一个地方,其他对象全变了这个问题。


四、代理模式

创建代理类,实现被代理类的方法,注入原始方法,在其前后可以增加非业务性功能,例如监控,统计,鉴权,限流,日志。 使得业务开发人员专心于业务。解耦业务与附加功能。


五、桥接模式

原文:

Decouple an abstraction from its implementation so that the two can vary independently

翻译过来,桥接模式的定义是“将抽象和实现解耦,让它们可以独立。这里所说的“抽象”,指的并非“抽象类”或“接口”,而是跟具体的实现无关的、被抽象出来的一套“类库”,或者说是骨架。这里所说的“实现”,也并非指“接口的实现类”,而是跟具体对象相关的一套“类库”,或者说是要填满骨架的血肉。

举个例子,有个图形,形状可以是三角形,正方形,颜色可以是红色和黑色。那么图形的抽象:x色的x形,即两个属性,颜色,形状。实现:三角形实例,正方形实例,红色实例,黑色实例。通过组合的方式拼凑出红色正方形这么一个实例。这个bridge,就是将形状和颜色桥接起来的抽象—图形


六、装饰器模式

通过组合代替继承,给原始类添加增强功能(业务性功能),这是与代理模式最大的区别。此外,装饰器,可以多层装饰。 装饰器类要和原始类继承相同的接口类或者抽象类。

七、适配器模式

适配器模式,是为了让原始类的接口兼容更多场景。 发展由来:弥补设计缺陷的补救行为。 使用场景:

实现方式有:类适配器,对象适配器。

代理模式、装饰器模式提供的都是和原始类相同的接口。而适配器模式提供的是与原始类不同的。


八、门面模式

封装、组合多个细粒度接口,提供高层次的易用的接口。 在rpc、分布式系统中,门面模式可以减少网络调用次数,减少通讯成本,达到提高性能的效果


九、组合模式

原文:

Compose objects into tree structure to represent part-whole hierarchies. Composite lets client treat individual objects and compositions of objects uniformly.

组合模式,将一组对象组织成树形结构,将单个对象和组合对象都看做树中的节点,以统一处理逻辑,并且它利用树形结构的特点,递归地处理每个子树,依次简化代码实现。

业务场景必须能够表示成树形结构。

将一组对象,组织成树型结构,以表达“部分-整体”的层级,让部分与整体,可以通过递归的方式,有统一的处理逻辑。

十、享元模式

享元:共享元数据。

意图是复用对象,节省存储。使用前提,共享的元数据,是不可变的。 可变的话,会带来不可控制的预期。 使用场景: 当系统中,存在大量相同的重复对象,我们可以保存一份实例,通过引用的方式提供别处使用。

十一、观察者模式

观察者和被观察者解耦。

十二、模版模式

英文原文:

Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.

意思是: 一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。

这里的算法,应用于业务系统开发,其实就是业务逻辑或业务流程。

模板,即是这句话的“算法骨架”。

举个例子,有个业务逻辑叫“回家后做的事情”,模板:“开门,吃饭,吃完饭去娱乐,之后洗澡”,那么每天回家,我可以 “开门,—>狼吞虎咽的用筷子吃面,—>玩游戏,—>冲个凉水澡”;也可以“开门,—>点个蜡烛慢慢吃一顿西餐,—>看电影,—>泡个澡”。

作用 复用:开门这个逻辑单元 可以被复用。 扩展:在不改变流程的情况下,子类可以自定义框架功能。即我想怎么吃,怎么娱乐,怎么洗澡,都可以自定义。

十三、策略模式

组成:策略的定义,创建,使用。 解耦:解耦策略的定义,创建,使用。 策略定义:一个接口和一组实现该接口的实现类。 策略的创建:策略的工厂模式,用map直接get。 策略的使用:运行时动态确定。 好处:1、减少if-else判断逻辑 2、满足开闭原则,只需要加新策略,集中化、最小化的修改代码,减少bug的发生率。

十四、职责链模式

因为每个处理器各自承担各自的处理职责,所以叫职责链。

定义:

Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.

避免了请求的发送者和接受者之间的耦合关系,使多个对象都有机会处理请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象可以处理它为止。

1、简化代码复杂度。每个处理器职责明确。有自己的逻辑。 2、ocp原则。添加新的算法,add进链,即可。

应用 servlet filter和spring interceptor。都实现对http请求进行拦截处理。 servlet filter 基于web容器,spring interceptor基于spring 框架,所以先经过servlet filter 再经过 spring interceptor。

filter--->servlet service --->spring dispatcher ---> prehandle --->业务流程--->posthandle--->afterCompletion--->filter

十五、迭代器模式

迭代器模式,提出一个遍历类,将集合类和遍历操作拆分开,让两者职责更加单一。 (可以让多个类都有的操作,提出一个新的操作类,迭代器模式的出现。也可将这个思路用于其他类)

遍历集合元素时,增加或者删除集合中的元素,有可能会导致某个元素被重复遍历或遍历不到的未决行为。

所以,一种是遍历的时候不允许增删元素,另一种是增删元素之后让遍历报错。第二种解决方案更加合理,Java 语言就是采用的这种解决方案

十六、状态模式

状态机就是,一个状态下,因为一个事件,会导致状态有什么转移,触发什么事件。

状态模式通过将事件触发的状态转移和动作执行,拆分到不同的状态类中,来避免分支判断逻辑。

状态机有 3 个组成部分:状态(State)、事件(Event)、动作(Action) 简单状态机可以通过if else 或者查表发实现。但是触发的动作较多,则以上两种就不合适了。需要通过状态模式来实现。 定义一个 状态的所有事件的接口。所有状态类,实现此接口。

public interface State { //所有状态类的接口 
    State getName();
    //以下是定义的事件 
    void eventA();
    void eventB();
    void eventC();
    void eventD();
}

在多重状态下,都有相同的事件,且触发的动作复杂,即可考虑状态模式。

十七、备忘录模式

Captures and externalizes an object’s internal state so that it can be restored later, all without violating encapsulation.

中文就是:

在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。

主要是用来防丢失、撤销、恢复等。

命令模式

The command pattern encapsulates a request as an object, thereby letting us parameterize other objects with different requests, queue or log requests, and support undoable operations.

中文:命令模式将请求(命令)封装为一个对象,这样可以使用不同的请求参数化(parameterize)其他对象(将不同请求依赖注入到其他对象),并且能够支持请求(命令)的排队执行、记录日志、撤销等(附加控制)功能。

借助命令模式,我们可以将函数封装成对象。具体来说就是,设计一个包含这个函数的类,将其实例化一个对象,作为参数,进行传递。

在命令模式中,不同的命令具有不同的目的,对应不同的处理逻辑,并且互相之间不可替换

在策略模式中,不同的策略具有相同的目的、不同的实现、互相之间可以替换

解释器模式

Interpreter pattern is used to defines a grammatical representation for a language and provides an interpreter to deal with this grammar.