行为型模式(11种)

一、责任链模式(Chain of Responsibility Pattern)

意图:创建一个处理请求的对象链,对象发送者和对象接受者解耦。责任链上的对象如果不能处理请求,就会把请求发送给下一个责任链节点。

实现:

  1. 创建责任链节点的抽象类
  2. 使用抽象类生成若干处理节点
  3. 节点依次连接,保存下一个节点的地址
  4. 当请求进入时判断是否是自己处理的类型,不是传给下一个节点。
  5. 请求发送给责任链头节点即可

二、命令模式(Command Pattern)

意图:将请求(可以是调用方法的请求)封装成一个对象,再创建一个执行类,可以向执行类中添加请求对象,然后再统一执行。执行前可以任意添加和删除命令。过程有点类似建造者模式,添加添加然后统一执行。

实现:

  1. 创建一个命令的接口,声明一个execute()执行方法
  2. 创建一个请求类,里面有若干方法。这个方法原本是直接被调用的,现在要被外面包裹成命令,然后多个命令放到一个执行类中按顺序执行。
  3. 实现命令接口,每个命令类代表不同的操作。构造方法接收一个请求类,然后在execute()方法中对于具体执行操作封装。
  4. 创建一个命令调用类,类中包含一个列表存储放入的命令类。其中主要包含
  • 命令列表(list)
  • 添加命令的方法
  • 删除命令的方法
  • 循环调用命令列表中的命令的执行方法
  • 还可以有记录执行了那些命令的方法...(可以根据记录还原)
  • 还可以加上undo()方法,用于撤销执行的命令。具体实现要结合业务。
  1. 向命令盗用类中添加若干命令,然后调用执行方法统一执行所以的命令

三、解释器模式(Interpreter Pattern)

意图:将语言或者表达式解析成具体的操作,例如sql解析,数学公式计算(符号处理引擎)等

实现:

  1. 创建表达式接口Expression,声明一个解析方法interpret
  2. 创建终结符类(不能再分割的元素)比如 1 + 2中的12都是终结符
  3. 创建非终结符(还能再被分割)1 + 2中的++号左右都可以有元素,在语法树上就是父节点,拥有左右两个子节点。而终结符就是叶子节点。
  4. 终结符和非终结符都在解析里定义好自己的功能,
    1 + 1中的终结符就是构造函数接受字符串并转化成int类型保存。
    非终结符+就是构造函数中接收两个终结符,并调用其解析方法结果相加返回
  5. 将需要解释的字符串构建成语法树,即非终结符是父节点,终结符是叶子节点的树。然后深度遍历并解析。

四、迭代器模式(Iterator Pattern)

意图: 提供一个方便的遍历集合的方法,但是不用暴露内部结构。

例子: Java中的集合迭代器

实现:

  1. 创建一个迭代器接口,内部声明hasNext()next()方法
  2. 创建一个集合类,内部构件好存储的结构,并实现迭代器接口
  3. 内部使用一个游标存储当前访问位置,int index
  4. hasNext方法返回游标是否到了结尾
  5. next方法返回当前游标所在的元素,并且游标下移。

五、中介者模式(Mediator Pattern)

用于降低对象和类之间的通信复杂性。遵循迪米特原则,即最少知道原则。
将原来网状的通信方式转换成星型的结构,所有的类都通过一个中介类进行交流。

实现:

  1. 创建一个中介类,其中有发送信息的方法
  2. 创建沟通的类,其中的发送方法使用的就是中介类的方法进行发送

六、备忘录模式(Memento Pattern)

允许获取类的内部状态,并且可以设置状态以便回复到导出时的状态。
在不破坏封装的前提下可以完成类的备份还原,可以用作游戏存档、撤销操作、历史、事务等。

实现:

  1. 创建状态的类,其中的成员变量就是从需要还原的类中提取出来的变量。
  2. 创建用于存储和获取状态的类,其中用集合保存状态类。
  3. 需要还原的类中实现提取状态和通过状态类还原的操作,提取也就是把相应的变量赋值给状态类,还原就是把状态类的信息保存到相应变量。

七、观察者模式(Observer Pattern)

订阅/发布 的模式,发布消息后会通知所有订阅了这个主题topic的类。
和中介模式的区别是这个是很明显的主体和客体的结构,一个主体发送信息,多个客体接收。
中介模式是所有的类只关心自己和中介类之间的关系,沟通全部交给中介处理。

实现(mqtt的例子):

  1. 设备连接mqtt服务器时维持连接(tcp)
  2. 设备主动订阅主题,服务器根据主题保存相应设备信息(在集合里保存观察者的信息)
  3. 主题有新的发布后推送给订阅了此主题的设备

八、状态模式(State Pattern)

意图:
允许类的内部在状态发生改变时改变他的行为
代码中有很多改变对象状态的条件语句时,可以使用状态模式将部分条件语句隐藏在类中
把类的可能出现的状态都列举并封装了

缺点:
结构较为复杂
对于开闭原则的支持不是很好,增加状态一定要修改逻辑
类会变庞大

实现:
在类中声明一个状态的属性
进行操作之前判断一下状态,然后再执行相应的动作

九、策略模式(Strategy Pattern)

策略模式就是把操作逻辑封装成不同的类,通过选择不同的类实例化就是选择不同的策略。
这种模式可以减少if...else的判断次数,逻辑清晰。
算法自由切换,并且拓展性良好
缺点是会增加代码量
spring中可以直接把类注册为组件,然后再通过名字注入。很方便就能实现

实现:
创建策略的接口,内部有具体的操作方法
创建不同的策略实现类,例如+的策略,就是把传入值相加。-的策略就是把传入值相减。
实例化策略类,并使用接口操作,执行操作方法。
因为是使用接口操作,所以策略类可以更换成其它的策略也可以正常运行

十、模板模式(Template Pattern)

意图:在抽象类中写好其它几个抽象方法直接的调用关系,具体方法让子类实现。即搭建好累的框架,细节让子类自己实现。

实现:

  1. 创建一个游戏的抽象类,内部有初始游戏、开始游戏、结束游戏三个抽象方法
  2. 增加一个final play方法,按顺序调用初始、开始、结束三个抽象方法。以指明子类的执行顺序也是这样
  3. 创建子类,实现此抽象类。实现具体的抽象方法
  4. 通过父类执行play方法

十一、访问者模式(Visitor Pattern)

意图:当一个类的数据结构很稳固,但是操作容易改变。或者类中有很多和结构无关的操作,防止这些操作改变类的数据。所以采用访问者模式进行数据和操作的分离。
有良好的拓展性,符合单一职责原则,灵活

关键:数据类中实现一个接收访问的方法,并调用访问者的访问方法,传入自身
访问者根据传入的数据类进行操作

实现:

  1. 创建一个被访问接口,内部有一个被访问的方法,入参是访问者接口
  2. 访问者接口,内部有访问的方法,入参是被访问者接口
  3. 实现接口
  4. 访问者需要访问时就直接调用被访问者的被访问方法,并使用入参操作值。

其它设计模式

空对象模式(Null Object Pattern)

意图:用一个代表空的对象代替null,空对象相对于null可以拥有默认的行为。

实现:
创建一个对象接口,有isNil和相应操作的方法
创建一个空对象,并实现isNil方法,用于判断当前方法是否为空。并赋予默认方法,例如输出当前为空
创建非空对象,实现isNil方法,并实现操作方法,如输出非空
然后就可以使用了,比如从集合中取出非空元素并执行。
-》 遍历集合,判断是否为空,并执行默认方法

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容