`
lh_kevin
  • 浏览: 42869 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

策略模式与状态模式

 
阅读更多

 

策略模式和状态模式虽然类图上很相似,但是运用的时候个人觉得有很大的区别.

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

状态模式主要突出了两个字:”改变, 对!对象的状态决定了状态的行为,事物的本质决定了事物的行为,我们精神亢奋的时候,我们拼命的工作,我们拼命的工作就导致了我们身心疲惫,物品们身心疲惫就导致我们的行为是需要休息;从这里我们可以看出,事物的内在状态决定了事物所做出的行为,而事物的行为势必又会改变我们事物的状态,两者在不断的相互影响,然后实现状态的迁移和跃迁;

 

从这两点,我们可以看出策略模式和状态模式的应用场景有很大的不同:一个是封装一系列平行且复杂多变的实现方式,一个是实现把对象的内在状态的变化封装起来,用外部行为来表现出来;

 

状态模式类图如下:

 

状态模式:当一个对象的内在状态变化时允许改变起行为,这个对象看起来像是改变了其类。
下面的例子是员工每天工作的状态和行为。小时和工作是否完成 是状态,精神百倍,午休等是行为。

代码如下:

class Work {
	
	private int hour = 9;
	private boolean isWorkFinished;
	
	private State state;
	
	public Work(){
		state = new MorningState();
	}
	
	public void writeProgram(){
		state.WriteProgram(this);
	}
	
	
	public int getHour() {
		return hour;
	}
	public void setHour(int hour) {
		this.hour = hour;
	}

	public boolean isWorkFinished() {
		return isWorkFinished;
	}
	public void setWorkFinished(boolean isWorkFinished) {
		this.isWorkFinished = isWorkFinished;
	}
	
	public State getState() {
		return state;
	}
	public void setState(State state) {
		this.state = state;
	}
}

abstract class State {
	public abstract void WriteProgram(Work work);	
}

class MorningState extends State {
	public void WriteProgram(Work work) {
		if(work.getHour() < 12){
			System.out.println("当前时间为上午:"+work.getHour()+"点,精神百倍");
		}else{
			work.setState(new NoonState());
			work.writeProgram();
		}
	}
}

class NoonState extends State {
	public void WriteProgram(Work work) {
		if(work.getHour() < 13){
			System.out.println("当前时间为中午:"+work.getHour()+"点,午饭,午休");
		}else{
			work.setState(new AfterNoonState());
			work.writeProgram();
		}
	}
}

class AfterNoonState extends State {
	public void WriteProgram(Work work) {
		if(work.getHour() < 17){
			System.out.println("当前时间为下午:"+work.getHour()+"点,精神百倍,继续");
		}else{
			work.setState(new EveningState());
			work.writeProgram();
		}
	}
}

class EveningState extends State {
	public void WriteProgram(Work work) {
		if(work.isWorkFinished()){
			work.setState(new RestState());
			work.writeProgram();
		}else{
			if(work.getHour() < 21){
				System.out.println("当前时间为晚上:"+work.getHour()+"点,继续加班");
			}else{
				work.setState(new SleepState());
				work.writeProgram();
			}
		}
	}
}

class RestState extends State {
	public void WriteProgram(Work work) {
		System.out.println("当前时间为晚上:"+work.getHour()+"点,回家休息");
	}
}

class SleepState extends State {
	public void WriteProgram(Work work) {
		System.out.println("当前时间为晚上:"+work.getHour()+"点,下班回家睡觉");
	}
}

public class StateClient {

	public static void main(String[] args) {
		Work work = new Work();
		work.setHour(9);
		work.writeProgram();
		
		work.setHour(12);
		work.writeProgram();
		
		work.setHour(14);
		work.writeProgram();
		
		work.setHour(18);
		work.writeProgram();
		
		//work.setWorkFinished(false);
		work.setWorkFinished(true);
		work.setHour(19);
		work.writeProgram();
		
		work.setHour(22);
		work.writeProgram();

	}

}

 

如果用普通思路去写,势必会多个if else再嵌套if else,那么方法势必会过长。方法过长是坏味道。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况。把状态的判断转移到表示不同状态的一系列类中,可以把复杂判断简化。
当一个状态的行为取决于他的状态,并且他必须在运行时刻根据状态改变他的行为时,可以考虑使用状态模式。
如果业务有多个状态,通常为一些枚举常量,状态的变化都是依靠大量的分支判断来实现,此时可以考虑将每一种业务状态定义为一个state的子类,这样这些对象就可以不依赖于其他对象
而独立变化了,哪天客户要改变需求,增加或减少业务状态或改变状态流程,都是不难的事。

 


 策略模式 略

 

 

 

 

  • 大小: 7.1 KB
分享到:
评论

相关推荐

    55-Java设计模式之策略模式与状态模式1

    55-Java设计模式之策略模式与状态模式1

    23种设计模式之:建造者,代理,观察,策略,状态模式

    用幽默的方式写下这些设计模式,代码里面有相应注解,不会很难理解,每个包里面有1-2个代码事例,还有一点小说明,还有本人qq,现在只有5种,其他的设计模式期待下一个版本吧!

    unity-23种常见设计模式unity版

    总体来说设计模式分为三大类: 创建型模式:共五种:...行为型模式:共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    设计模式-C++

    创建型模式,共五种:工厂方法模式、抽象工厂模式、...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    java 23种设计模式.zip

    设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象...4.行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。

    23种设计模式项目实例

    创建型模式,共五种:工厂方法模式、抽象工厂模式、...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    设计模式1,策略模式

    设计模式中的策略模式,门有两个状态,实现开门关门

    对比Java设计模式编程中的状态模式和策略模式

    主要介绍了Java设计模式编程中的状态模式和策略模式对比,文中列举了两种模式的相似点和不同点,并都举了代码的实例作为参照,需要的朋友可以参考下

    基于Java实现的23种设计模式Demo,抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式等

    抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式、桥接模式、组合模式、装饰模式、享元模式、代理模式、命令...录模式、观察者模式、状态模式、策略模式、模板方法模式、责任链模式...

    《Java设计模式》详解

    内容包括统一建模语言基础知识、面向对象设计原则、设计模式概述、简单工厂模式...状态模式、策略模式、模板方法模式、访问者模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式...

    java常用23中设计模式

    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。

    23种JAVA设计模式和15种J2EE设计模式

    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。

    java设计模式示例

    java设计模式示例 创建型模式(5种):工厂方法模式,...行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    java设计模式

    32.2 策略模式VS状态模式 32.2.1 策略模式实现人生 32.2.2 状态模式实现人生 32.2.3 小结 32.3 观察者模式VS责任链模式 32.3.1 责任链模式实现DNS解析过程 32.3.2 触发链模式实现DNS解析过程 32.3.3 小结 第33章 跨...

    Java23种设计模式可直接运行Demo

    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。

    C#23种设计模式样例代码和UML图

    行为型模式(策略模式、 迭代器模式、原型模式、职责链模式、 模板方法、 命令模式、 解释器模式、 中介者模式、 访问者模式、 状态模式、 备忘录模式); 结构型模式(代理模式、桥接模式、适配器模式、外观模式、...

    23种设计模式 -设计模式图解.7z

    23种设计模式的特点定义、优缺点、使用场景,源码中...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    设计模式课程每章ppt(共27章).zip

    ├── 第24章_状态模式.ppt ├── 第25章_策略模式.ppt ├── 第26章_模板方法模式.ppt ├── 第27章_访问者模式.ppt ├── 第2章_面向对象设计原则.ppt ├── 第3章_设计模式概述.ppt ├── 第4章_简单工厂...

    23种设计模式实例

    总体来说设计模式分为三大类: ...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式例子

    设计模式的精简版

    java设计模式的精简版,创建型模式:工厂方法模式,抽象...行为型模式:策略模式,模板方法模式,观察者模式,迭代子模式,责任链模式,命令模式,备忘录模式,状态模式,访问者模式,中介者模式,解释器模式,共11种

Global site tag (gtag.js) - Google Analytics