0
点赞
收藏
分享

微信扫一扫

设计模式——行为型模式之状态模式、备忘录模式(状态转换还在用if-else和switch吗?还不知道备份和恢复怎么实现吗?)

文章目录


前言

一、状态模式定义

状态模式:提供一种一对多的转化设计,当对象状态发生转变时,能够动态修改对象功能,使得对象状态变更。

可以通过状态转化图的形式表示:

以电梯状态变化为例子:

在这里插入图片描述

二、状态模式的结构

在这里插入图片描述

  • State/StateA…:状态定义类,支持各个状态下的行为。
  • Context: 状态保存类,保存当前状态信息,可以修改状态,运行当前状态下的行为。
class User{
	public static void main(String[] args){
		Context context=new Context();
		context.setState(new StateA());
		//当前在状态A
		
		context.request("输出A状态的行为")
		//当前执行的StateA的处理函数
		
		context.setState(new StateB());
		//修改为状态B
		
		context.request("输出B状态的行为")
		//当前执行的StateB的处理函数
	}
}

按照上面电梯的例子,通过在状态内部函数执行时修改状态(为了简单只实现开关转换):

abstract class State{
	protected Context context;//需要在状态中转换状态
	public setContext(Context context){
		this.context=context;
	}
	//定义开门
	public abstract void opendor();
	//定义关门
	public abstract void closedor();
}

class OpenningState extends State{
	@Override
	public void opendor(){
		System.out.println("已经是打开状态了");
	}
	@Override
	public void closedor(){
		System.out.println("正在关闭电梯");
		//修改状态,在Context中用静态量来保存状态
		super.context.setState(Context.closeingState);
	}
}

class OpenningState extends State{
	@Override
	public void closedor(){
		System.out.println("已经是关闭状态了");
	}
	@Override
	public void opendor(){
		System.out.println("正在打开电梯");
		//修改状态,在Context中用静态量来保存状态
		super.context.setState(Context.openningState);
	}
}

class Context{
	public final static OpenningState openningState=new OpenningState();
	public final static CloseingState closeingState=new CloseingState();
	private State state;
	public State getSate(){
		return state;
	}
	public void setState(State state){
		this.state=state;
		this.state.setContext(this);
	}
	public void opendor(){
		state.opendor();
	}
	public void closedor(){
		state.closedor();
	}
}

public class Test{
	public static void main(String[] arg){
		Context context=new Context();
		//设置初始状态为关闭
		context.setState(Context.closeingState);
		context.opendor();
		//“正在打开电梯”
		context.closedor();
		//“正在关闭电梯”
	}
}

Context中保存了当前状态,当前状态又记录了Context,方便在执行完状态转换的函数(比如在关闭时执行打开电梯,就是一次状态转换)时修改Context中保存的当前状态。

即Context执行了当前状态State子类的状态转换函数——函数中更新了Context的当前状态——此时Context的函数变为另一个状态的相应函数。

三、备忘录模式定义

备忘录模式:在对象之外保存对象内部状态,在对象被修改后,允许通过外部保存的状态恢复。

比如你正在写一篇博客,然后写到一半copy一份到备忘录上保存一下,之后快写完了就发生喜闻乐见的失误操作(完全删除+自动保存等或者奇妙消失)导致你的博客草稿全无…
然后你可以通过备忘录恢复一部分…这就是备忘录模式!!!

四、备忘录模式结构

在这里插入图片描述

public class Demo{
	private static Originator o=new Originator();
	private static Caretaker c=new Caretaker();
	public static void main(String[] args){
		o.setState("现在我是这个状态");
		c.save(o.creatMemento());//c保存了o创建的状态信息
		o.setState("现在我修改了状态");

		o.restore(c.retrieve());//o获取了c保存的备份信息
		//现在o是"现在我是这个状态"这个备份的状态。

五、总结和评价

状态模式和备忘录模式都是保存修改对象状态的行为型模式——

  • 状态模式:面对对象状态修改较多,状态间变化较为频繁的设计需求,能够在状态内部实现状态转换,而不是一串if-else或者switch语句来控制状态,实现了状态责任的分割。

  • 备忘录模式:应用于对象需要保存和恢复的情况,不是又对象自身负责自己的保存,而是输出一个状态类,让其他类来保存状态(可以同时保存多个状态)。

综上所述:

  • 状态模式优点:
  • 备忘录模式优点:
  • 缺点:

设计模式系列文章

系列文章:

结尾

举报

相关推荐

0 条评论