`
cakin24
  • 浏览: 1333672 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

状态模式——文档编辑模式切换

阅读更多

一模式定义

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来就像是改变了其类。

 

二模式举例

1模式分析

我们借用文档编辑模式切换这一案例来说明这一模式。


 

2状态模式静态类图


 

3代码示例

3.1创建状态接口一IState

package com.demo.state;

import com.demo.context.Context;

/**
 * 
 * 状态接口
 * 
 * @author
 * 
 */
public interface IState {
	/**
	 * 状态转换
	 * 
	 * @param context
	 * @param mode
	 */
	public void convertState(Context context, int mode);

	/**
	 * 保存方法
	 * 
	 * @param context
	 */
	public void save(Context context);

	/**
	 * 修改方法
	 * 
	 * @param context
	 */
	public void modify(Context context);

	/**
	 * 新增方法
	 * 
	 * @param context
	 */
	public void add(Context context);

	/**
	 * 查看方法
	 * 
	 * @param context
	 */
	public void view(Context context);
}

3.2创建上下文环境一Context

package com.demo.context;

import com.demo.state.IState;

/**
 * 上下文环境
 * 
 * @author
 * 
 */
public class Context {
	// 预览模式
	public static final int PREVIEW_MODE = 0;
	// 编辑模式
	public static final int EDIT_MODE = 1;
	// 当前状态
	private IState state;

	// 改变状态
	public void changeState(IState state) {
		this.state = state;
	}

	/**
	 * 运行
	 * 
	 * @param mode
	 */
	public void doWork(int mode) {
		System.out.println("-----------------");
		this.state.convertState(this, mode);
		this.state.add(this);
		this.state.save(this);
		this.state.modify(this);
		this.state.view(this);
		System.out.println("-----------------");
	}
}

3.3编辑状态一EditState

package com.demo.state;

import com.demo.context.Context;

/**
 * 编辑模式状态
 * 
 * @author
 * 
 */
public class EditState implements IState {
	/**
	 * 状态转换
	 */
	public void convertState(Context context, int mode) {
		if (mode == Context.PREVIEW_MODE) {
			context.changeState(new PreviewState());
		}

	}

	/**
	 * 编辑模式新增
	 */
	public void add(Context context) {
		System.out.println("编辑模式【新增】...");

	}

	/**
	 * 编辑模式修改
	 */
	public void modify(Context context) {
		System.out.println("编辑模式【修改】...");

	}

	/**
	 * 编辑模式保存
	 */
	public void save(Context context) {
		System.out.println("编辑模式【保存】...");

	}

	/**
	 * 编辑模式查看
	 */
	public void view(Context context) {
		System.out.println("编辑模式【查看】...");

	}

}

3.4预览状态一PreviewState

package com.demo.state;

import com.demo.context.Context;

/**
 * 预览模式状态
 * 
 * @author
 * 
 */
public class PreviewState implements IState {

	/**
	 * 状态转换
	 */
	public void convertState(Context context, int mode) {
		if (mode == Context.EDIT_MODE) {
			context.changeState(new EditState());
		}
	}

	/**
	 * 预览模式新增
	 */
	public void add(Context context) {
		System.out.println("预览模式不支持【新增】功能!");

	}

	/**
	 * 预览模式修改
	 */
	public void modify(Context context) {
		System.out.println("预览模式不支持【修改】功能!");

	}

	/**
	 * 预览模式保存
	 */
	public void save(Context context) {
		System.out.println("预览模式不支持【保存】功能!");

	}

	/**
	 * 预览模式查看
	 */
	public void view(Context context) {
		System.out.println("预览模式【查看】...");
	}

}

3.5客户端测式一Client

package com.demo;

import java.util.Random;

import com.demo.context.Context;
import com.demo.state.EditState;

/**
 * 客户端应用
 * 
 * @author
 * 
 */
public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Context context = new Context();
		context.changeState(new EditState());
		Random random = new Random();
		for (int i = 0; i < 5; i++) {
			int r = random.nextInt(2);
			System.out.println("当前模式:"
					+ (r == 0 ? "预览模式" : (r == 1 ? "编辑模式" : "")));
			context.doWork(r);
		}
	}
}

4运行结果

当前模式:编辑模式

-----------------

编辑模式【新增】...

编辑模式【保存】...

编辑模式【修改】...

编辑模式【查看】...

-----------------

当前模式:编辑模式

-----------------

编辑模式【新增】...

编辑模式【保存】...

编辑模式【修改】...

编辑模式【查看】...

-----------------

当前模式:预览模式

-----------------

预览模式不支持【新增】功能!

预览模式不支持【保存】功能!

预览模式不支持【修改】功能!

预览模式【查看】...

-----------------

当前模式:预览模式

-----------------

预览模式不支持【新增】功能!

预览模式不支持【保存】功能!

预览模式不支持【修改】功能!

预览模式【查看】...

-----------------

当前模式:编辑模式

-----------------

编辑模式【新增】...

编辑模式【保存】...

编辑模式【修改】...

编辑模式【查看】...

-----------------

 

三该模式设计原则

1"开——闭"原则

2单一职责原则

 

四使用场合

1一个对象的行为取状于它的状态,井且它必须在运行时刻根据状态改变其行为。

2一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

 

五状态模式静态类图



 

  • 大小: 105.4 KB
  • 大小: 43.9 KB
  • 大小: 66.6 KB
1
1
分享到:
评论

相关推荐

    Microsoft-Word2010培训教程.doc

    目 录 1基本操作 4 1.1启动和认识Word 2010工作界面 4 1.2新建... 法一:按键盘上的"Insert"键 法二:单击状态栏的"插入"或"改写"按钮 2.1.2插入符号 "插入"选项卡——&gt;符号——&gt;其他符号 2.2文本的编辑 2.2.1选定文本

    VIM实用技术 技巧、插件和定制

    选择模式之一选定文本块之后,可以使用“Ctrl-G”切换到另一模式——该模式很少在Linux上 使用,本文中就不再介绍了。 Vim带有完整的帮助文档。在当前的Vim 6.4的标准发布中,有一百多章、近六十万英文词的帮助文 件...

    asp.net知识库

    asp.net 2.0下嵌套masterpage页的可视化编辑 C# 2.0与泛型 动态调用对象的属性和方法——性能和灵活性兼备的方法 泛型技巧系列:用泛型打造可复用的抽象工厂 泛型技巧系列:如何提供类型参数之间的转换 .NET 2.0 ...

    protel2004封装

    ctrl+tab——在打开的各个设计文件文档之间切换 alt+tab——在打开的各个应用程序之间切换 a——弹出edit\align子菜单 b——弹出view\toolbars子菜单 e——弹出edit菜单 f——弹出file菜单 h——弹出help菜单 j——...

    库卡机器人安全操作规程.doc

    机器人运行完"HOME"例行程序后,将机器人运行模式切换到自动状态,机器人进入自 动运行状态; 1. 生产结束后,需要对机器人做保养时,按下请求服务按钮,机器人将会自动运行到 服务位,待机器人完全停止时,拉开门上...

    KODExplorer 芒果云-资源管理器

    - 文件编辑器,文件树目录 上下左右键盘切换 快捷键加入 - 树目录去掉库,改为个人目录等多处文案修改 - 默认打开用户目录 ####fix bug:(bug解决和程序优化) - 桌面任务栏点不中bug - 部分文案问题 - 众多...

    阿赛树形论坛系统 AsaiSXBBS V5.rar

    24、支持普通论坛模式、普通树形模式、豪华树形模式三种个性模式,支持自由切换,可以自行设定默认的论坛显示模式; 25、默认提供8种论坛风格,可以设置默认的论坛,也可以在前台由用户自己选择喜欢的风格,所有...

    Visual C++ 2005入门经典.part08.rar (整理并添加所有书签)

    20.4.6 实现对话框切换 20.4.7 创建订单ID 20.4.8 存储订单数据 20.4.9 为订单选择产品 20.4.10 添加新订单 20.5 小结 20.6 练习 第21章 使用Windows Forms的应用程序 21.1 理解Wqndows Forms 21.2 理解Windows ...

    精通qt4编程(源代码)

    \ 第4章 程序主窗口—— QMainWindow 卢传富 Qt应用程序的主窗口是由多个部件/组件构成的框架,本章通过一个简单文本编辑器的例子,介绍了主窗口的菜单、工具条、中心部件、锚接部件和状态条,并通过Qt设计器绘制和...

    Visual C++ 2005入门经典.part04.rar (整理并添加所有书签)

    20.4.6 实现对话框切换 20.4.7 创建订单ID 20.4.8 存储订单数据 20.4.9 为订单选择产品 20.4.10 添加新订单 20.5 小结 20.6 练习 第21章 使用Windows Forms的应用程序 21.1 理解Wqndows Forms 21.2 理解Windows ...

    Visual C++ 2005入门经典.part07.rar (整理并添加所有书签)

    20.4.6 实现对话框切换 20.4.7 创建订单ID 20.4.8 存储订单数据 20.4.9 为订单选择产品 20.4.10 添加新订单 20.5 小结 20.6 练习 第21章 使用Windows Forms的应用程序 21.1 理解Wqndows Forms 21.2 理解Windows ...

    Visual C++ 2005入门经典.part09.rar (整理并添加所有书签)

    20.4.6 实现对话框切换 20.4.7 创建订单ID 20.4.8 存储订单数据 20.4.9 为订单选择产品 20.4.10 添加新订单 20.5 小结 20.6 练习 第21章 使用Windows Forms的应用程序 21.1 理解Wqndows Forms 21.2 理解Windows ...

    Visual C++ 2005入门经典.part05.rar (整理并添加所有书签)

    20.4.6 实现对话框切换 20.4.7 创建订单ID 20.4.8 存储订单数据 20.4.9 为订单选择产品 20.4.10 添加新订单 20.5 小结 20.6 练习 第21章 使用Windows Forms的应用程序 21.1 理解Wqndows Forms 21.2 理解Windows ...

    Visual C++ 2005入门经典.part06.rar (整理并添加所有书签)

    20.4.6 实现对话框切换 20.4.7 创建订单ID 20.4.8 存储订单数据 20.4.9 为订单选择产品 20.4.10 添加新订单 20.5 小结 20.6 练习 第21章 使用Windows Forms的应用程序 21.1 理解Wqndows Forms 21.2 理解Windows ...

    精通Qt4编程(第二版)源代码

    \ 第4章 程序主窗口—— QMainWindow 卢传富 Qt应用程序的主窗口是由多个部件/组件构成的框架,本章通过一个简单文本编辑器的例子,介绍了主窗口的菜单、工具条、中心部件、锚接部件和状态条,并通过Qt设计器绘制和...

    cmd操作命令和linux命令大全收集

    tftp -i 自己IP(用肉机作跳板时这用肉机IP) get server.exec:server.exe 登陆后,将“IP”的server.exe下载到目标主机c:server.exe 参数:-i指以二进制模式传送,如传送exe文件时用,如不加-i 则以ASCII模式(传送...

    影视字幕制作工具2款合集

    每按一下,标记0和1会切换,大家在用的时候可以自己在“设置”——“软件设置”——“键盘”——类别里面选“字幕”,然后找到“设此行为待定行”菜单,设置一个熟悉的快捷键。我是设置成了F7,比较方便,因为我经常...

    android开发揭秘PDF

    2.3 创建第一个Android项目——HeUoAndroid 2.3.1 创建HelloAndroid项目 2.3.2 运行HelloAndroid及模拟器的使用 2.3.3 调试HelloAndroid 2.4 小结 第二部分 基础篇 第3章 Android程序设计基础 3.1 Android程序框架 ...

Global site tag (gtag.js) - Google Analytics