`
lh_kevin
  • 浏览: 44001 次
  • 性别: 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

    Java 设计模式之策略模式与状态模式 策略模式是 Java 中的一种设计模式,它主要用于解决系统与第三方接口进行数据交互的问题。当系统需要与多种格式的数据进行交互时,使用策略模式可以很好地解决这个问题。例如,...

    策略模式

    - 策略模式与状态模式类似,但策略模式关注的是算法的不同实现,而状态模式关注的是对象状态变化带来的行为变化。 综上所述,策略模式是一种强大的设计模式,它允许我们在运行时动态选择和切换算法,提高了代码的...

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

    本文将重点介绍标题中提到的五种设计模式:建造者模式、代理模式、观察者模式、策略模式以及状态模式。 **1. 建造者模式(Builder)** 建造者模式是一种创建型设计模式,它允许我们分步骤构建复杂对象,而无需暴露...

    观察者模式和策略模式举例

    观察者模式和策略模式是软件设计模式中的两种重要概念,它们在解决特定问题时能提供高效、灵活的解决方案。设计模式是一种在特定情况下解决问题的通用、可重用的解决方案,是经验丰富的软件开发者们智慧的结晶。 ...

    23种设计模式

    - **策略模式与状态模式**: 状态模式是根据状态的变化来选择相应的行为,而策略模式则是根据需要或客户端的要求来选择相应的实现类。 - **策略模式与模板方法模式**: 模板方法模式关注的是算法骨架的定义,而策略...

    Java开发之策略模式责任链模式状态模式观察者模式合并扣减库存demo.zip

    Java开发之策略模式责任链模式状态模式观察者模式合并扣减库存demo Java开发之策略模式责任链模式状态模式观察者模式合并扣减库存demo Java开发之策略模式责任链模式状态模式观察者模式合并扣减库存demo

    策略模式工厂方法模式观察者模式

    1. **策略模式**的学习文档,可能会通过具体的案例,如不同排序算法的实现来解释如何使用策略模式,例如快速排序、冒泡排序等。每个算法都可以作为一个策略类,而策略接口规定了算法的公共行为。 2. **工厂方法模式...

    设计模式-状态模式分享ppt

    #### 七、状态模式与策略模式的区别 虽然状态模式和策略模式在结构上有一定的相似性,但它们的目的和应用场景有所不同: - **状态模式**:关注的是对象内部状态的变化,状态的改变会导致行为的变化,且状态之间的...

    PHP设计模式实例之(观察者模式、策略模式、简单工厂模式)借鉴.pdf

    PHP 设计模式实例之观察者模式、策略模式、简单工厂模式 PHP 设计模式实例之观察者模式、...观察者模式用于在对象之间定义一对多的依赖关系,策略模式用于定义一系列的算法,简单工厂模式用于提供一个创建对象的接口。

    C++设计模式课件4_策略模式.pdf

    ### C++设计模式课件4_策略模式.pdf #### 知识点概览 - **设计模式概述** - **策略模式动机分析** - **模式定义与结构解析** - **策略模式应用实例** - **策略模式优缺点分析** #### 设计模式概述 设计模式是一种...

    设计模式之单件模式、工厂模式、策略模式、观察者模式(php描述)(资料整理)

    接下来是策略模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。在PHP中,我们可以使用接口或抽象类定义策略行为,然后创建多个实现了该接口的具体...

    策略模式在android中使用

    在Android中,策略模式常常用于处理复杂的业务逻辑或者多种状态的切换。例如,在一个应用中,可能有多种不同的排序方式,如按时间、按评分等,每种排序方式都可以看作是一个策略。我们可以定义一个`SortStrategy`...

    headfirst 策略模式代码

    《深入理解Headfirst策略模式——基于Java代码实例》 策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Headfirst的讲解中,这个模式被巧妙地通过鸭子的例子来阐述,使得复杂的概念变得生动易懂。在...

    设计模式 策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。...同时,还可以学习如何通过组合多种策略,实现更复杂的行为,以及如何使用工厂模式或依赖注入等其他设计模式与策略模式配合使用。

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

    状态模式和策略模式都是设计模式中的重要成员,它们在Java编程中被广泛使用,以解决特定的软件设计问题。这两种模式都属于行为模式,因为它们关注的是对象如何响应某些行为。 首先,状态模式的主要思想是封装对象...

    设计模式——策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或策略来执行不同操作的情况。策略模式允许我们将算法封装到独立的可互换的策略对象中,从而使算法的...

    设计模式1,策略模式

    在"设计模式1,策略模式"的案例中,门的状态被用来作为策略模式的应用实例。门有两个基本状态:开和关,这两种状态可以被视为两种不同的策略。我们可以创建两个类,分别代表"开门"和"关门"的策略,它们都实现一个...

    策略模式+观察这模式

    策略模式和观察者模式是软件设计模式中的两种重要模式,它们在解决特定问题时具有很高的灵活性和可扩展性。下面将分别对这两种模式进行详细解释,并结合实例来说明其应用场景和使用方法。 策略模式是一种行为设计...

    策略(strategy)模式

    2. **封装变化**:策略模式封装了变化的算法,使得客户端代码无需关心具体算法的实现,只与策略接口交互,降低了系统的耦合度。 3. **多态性**:所有策略类都实现了同一个接口,因此可以在运行时以多态方式选择并...

Global site tag (gtag.js) - Google Analytics