设计模式-行为型模式
原文地址:http://blog.csdn.net/column/details/pattern.html?&page=1
行为型模式
- 模版方法模式
- 策略模式
- 状态模式
- 命令模式
- 迭代器模式
- 备忘录模式
- 观察者模式
- 中介者模式
- 访问者模式
- 责任链模式
- 解释器模式
模版方法模式
定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。
模版模式的核心是一个抽象类。抽象类将实现逻辑的骨架定义好,具体实现的抽象方法有继承的子类去实现。
策略模式
定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。
策略模式与模版模式的区别在于:
在模版方法模式中,调用算法的主体在抽象的父类中,而在策略模式中,调用算法的主体则是封装到了封装类Context中。
状态模式
定义:状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。
简单地说:一个Context对象的状态会发生改变,在他状态发送改变后,若调用request方法,具体的操作是有目前状态的handle方法来操作的,就如同request方法的发生了变化,换种说法,就如同Context对象看上去是改变了类。
状态模式与策略模式有相似之处,都是把具体的处理逻辑抽象封装出来,区别在于:
状态模式将各个状态所对应的操作分离开来,即对于不同的状态,由不同的子类实现具体操作,不同状态的切换由子类实现,当发现传入参数不是自己这个状态所对应的参数,则自己给Context类切换状态;而策略模式是直接依赖注入到Context类的参数进行选择策略,不存在切换状态的操作。
命令模式
定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
命令模式的核心在于对命令的封装,即通过将对命令的操作(接受者接口方法的执行顺序等)封装在命令对象的方法中,然后在合适的时间由调用者对象进行调用。调用者Invoker持有一组命令对象的实例。
通过命令对象可以有效降低命令与调用者对于具体操作的耦合,同时可以实现命令的撤销,批量执行等操作。
缺点:过多的简单命令对象创建(几行代码)会造成封装的繁琐。
迭代器模式
定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。
迭代器与集合是密不可分的,它可以在隐藏集合对象的内部实现的情况下提供一种有效的遍历集合的方式。
备忘录模式
定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。
发起人对象的某一瞬时状态可以用备忘录对象保存(可以是发起人对象的全部或部分属性值),备忘录有管理角色管理(管理角色保存一组备忘录对象的实例)。在需要还原的时候,可以通过获取管理角色中所保管的备忘录对象来还原发起人的状态。
观察者模式
定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。
如果一个对象的状态发生改变,某些与它相关的对象也要随之做出相应的变化,这时候最佳的解决方案既是观察者模式。
观察者模式一个重要点是注册于被观察者中的观察者集合。
中介者模式
定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。
中介者模式是将多个同事类之间的一对多耦合降低成一对一的星状耦合。一般情况下一对多的依赖在程序设计中是允许的,没有必要引用中介这模式。除非在依赖关系过于复杂的情况下,我们才使用中介者降低耦合。
访问者模式
定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
abstract class Element { public abstract void accept(IVisitor visitor); public abstract void doSomething(); } interface IVisitor { public void visit(ConcreteElement1 el1); public void visit(ConcreteElement2 el2); } class ConcreteElement1 extends Element { public void doSomething(){ System.out.println("这是元素1"); } public void accept(IVisitor visitor) { visitor.visit(this); } } class ConcreteElement2 extends Element { public void doSomething(){ System.out.println("这是元素2"); } public void accept(IVisitor visitor) { visitor.visit(this); } } class Visitor implements IVisitor { public void visit(ConcreteElement1 el1) { el1.doSomething(); } public void visit(ConcreteElement2 el2) { el2.doSomething(); } } class ObjectStruture { public static List<Element> getList(){ List<Element> list = new ArrayList<Element>(); Random ran = new Random(); for(int i=0; i<10; i++){ int a = ran.nextInt(100); if(a>50){ list.add(new ConcreteElement1()); }else{ list.add(new ConcreteElement2()); } } return list; } } public class Client { public static void main(String[] args){ List<Element> list = ObjectStruture.getList(); for(Element e: list){ e.accept(new Visitor()); } } }
访问者模式的优点
- 符合单一职责原则:凡是适用访问者模式的场景中,元素类中需要封装在访问者中的操作必定是与元素类本身关系不大且是易变的操作,符合单一职责原则。
- 扩展性良好:元素类可以通过接受不同的访问者来实现对不同操作的扩展。
引自原文:
但是,访问者模式并不是那么完美,它也有着致命的缺陷:增加新的元素类比较困难。通过访问者模式的代码可以看到,在访问者类中,每一个元素类都有它对应的处理方法,也就是说,每增加一个元素类都需要修改访问者类(也包括访问者类的子类或者实现类),修改起来相当麻烦。也就是说,在元素类数目不确定的情况下,应该慎用访问者模式。所以,访问者模式比较适用于对已有功能的重构,比如说,一个项目的基本功能已经确定下来,元素类的数据已经基本确定下来不会变了,会变的只是这些元素内的相关操作,这时候,我们可以使用访问者模式对原有的代码进行重构一遍,这样一来,就可以在不修改各个元素类的情况下,对原有功能进行修改。
最复杂的行为型模式。
责任链模式
定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
责任链模式其实就是一个灵活版的if…else…语句,它就是将这些判定条件的语句放到了各个处理类中。
如果if中的判断过于负载就可以使用责任链。
但是使用责任链时一定要注意链的顺序,以及避免出现死循环的情况。
解释器模式
定义:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。
基本用不到。
设计模式-行为型模式相关推荐
- 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript
设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript 简单工厂模式 定义一个接口,三个具体类.然后书写如下,通过选择,生产出相应的对象 // 定义Shape接口 interface Sh ...
- 设计模式-创建型模式-建造者模式
设计模式-创建型模式-建造者模式 建造者模式即生成器模式,将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 代码如下 // 产品类 public class Product{pu ...
- 设计模式-行为型模式-中介者模式
设计模式-行为型模式-中介者模式 行为型模式 划分类和对象的职责. 中介者模式 进销存管理,即采购,销售,库存. 其中类图 代码如下 public class Purchase {// 采购IBM电脑 ...
- 设计模式-行为型模式-责任链模式
设计模式-行为型模式-责任链模式 定义 将请求沿着链传递,然后直到对象处理即可. UML图 代码 基本的责任链 public class Test{public void test(int i, Re ...
- 设计模式-行为型模式-命令模式
设计模式-行为型模式-命令模式 基础 以一个MIS系统为栗子 MIS 管理信息系统(Management Information System,MIS)是一个以人为主导的,利用计算机硬件.软件和网络设 ...
- 设计模式-创建型模式-模板方法
设计模式-创建型模式-模板方法 定义一个操作中的算法框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义一个算法的步骤. protected 对于本包及其子类可见. 类图 代码 代 ...
- 设计模式-创建型模式-工厂模式(工厂三兄弟)
设计模式-创建型模式-工厂模式(工厂三兄弟) 工厂模式分为简单工厂,工厂方法,抽象工厂. 简单工厂模式 一个接口,三个具体类,一个工厂,通过选择,生产出对应的对象. package demo2;pub ...
- GOF23设计模式-创建型模式4-原型模式
设计模式GOF23-原型模式 思考 原型模式 原型模式实现 克隆绵羊多利(浅拷贝) 克隆绵羊多利(深拷贝) 利用序列化和反序列化技术实现深克隆 何时使用? 测试new与clone创建对象效率 思考 克 ...
- 设计模式 行为型模式 -- 备忘录模式 具体实例:游戏挑战BOSS
01:设计模式 行为型模式 – 备忘录模式(定义.结构.优缺点 适用场景分析) 02:设计模式 行为型模式 – 备忘录模式 具体实例:游戏挑战BOSS 03:设计模式 行为型模式 实例 – 备忘录模式 ...
- 七大设计原则与设计模式(创建型模式、结构型模式、行为型模式)
七大设计原则 开闭原则.依赖倒置原则.单一职责原则.接口隔离原则.迪米特法则(最少知道原则).里氏替换原则.合成 (组合).聚合复用原则 开闭原则 定义: 一个软件实体如类.模块和函数应该对扩展开放, ...
最新文章
- 2022-2028年中国炼钢行业市场研究及前瞻分析报告
- 文巾解题 20有效的括号
- Unicode简介【转】
- 1008 数组元素循环右移问题 (20分)
- 两个listmap合并去重_单机亿级规模题库去重,如果是你会怎么做?
- mysql 逆序排序_将一组乱序的字符进行排序进行升序和逆序输出
- lua系列之 lua-cjson模块安装报错问题解决
- Path of Equal Weight (30 分)
- 微信小程序发布全流程
- 手机控制电脑 linux,手机控制电脑 Splashtop远程管理体验
- 【C/C++】【面经】2022 网易互娱面经( 游戏客户端方向 )(更新:一面;二面;)
- 实训十七:交换机单端口环路检测配置
- 3D游戏设计——模型与动画
- Python项目-Day26-数据加密-hash加盐加密-token-jwt
- 计算机网络安全评估,计算机网络系统安全性分析及评估
- android 按键铺满屏幕,安卓全屏状态下键盘充满屏幕留不出ui控件的解决办法附edittext和键盘的属性...
- 枚举算法:韩信点兵。
- python输出学生姓名列表_Python-列表嵌套字典-名片管理系统(适合刚学习完字典和列表的同学练手)...
- 应急制冷精密空调 数据中心应急制冷系统
- 贵州移动大数据掘金有道
热门文章
- 华硕gl553vw是飞行堡垒几代_信仰也可以亲民:ASUS 华硕 推出 ROG Strix GL553VW 主流级游戏笔记本电脑...
- Jetson开发实战记录(一):Jetson家族的基本介绍
- Fedora linux重启网卡服务的命令
- Mathematica画图函数命令大全
- Kali卸载原装JDK,安装JDK1.8
- thinkphp 5.0 用户注册登录
- 字节跳动又做社交软件,这一次他能打败微信吗?
- 小型ssh工具dropbear 安装配置及使用详解
- d3js 生成树状图
- Upload-labs文件上传漏洞练习(1-5)