`

策略模式 状态模式

阅读更多

当设计一个对象可能在不同情况下有不同的行为时,一般使用的是父类 子类 多态重载的方法,

Person a=new WhitePerson();

Person b=new BlackPerson();

a.speak();// i'm white

b.speak();// i'm black

但这样做不好的地方在于 假如对象创建后了之后想在运行时改变对象的行为是不可能的,(当然可以用if else判断状态值,但这样一、多次判断状态的话有重复代码  二、增加状态的时候增加else会违反开闭原则)除非重新创建对象,所以这时可以用策略分离行为

interface SpeakAction(){

  void speak();

}

 

class BlackSpeak implements SpeakAction(){

  void speak(){

    print "I'm black"

  }

}

 

class WhiteSpeak implements SpeakAction(){

  void speak(){

    print "I'm white"

  }

}

 

Person{

  SpeakAction speak;

 

  void speak(){

    speak.speak();

  }

 

  void setSpeak(SpeakAction speak){

    this.speak=speak;

  }

}

 

这样当你想改变行为的时候通过setSpeak设置新的行为就可以了

 

 

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

状态模式的类图和策略模式的类图很相似,都是面向一个接口有一系列不同的实现,然后调用的时候面向接口调用不同的实现;但是,策略模式和状态模式虽然类图上很相似,但是运用的时候,个人觉得有很大的区别,关键在于你在如何理解你的代码需求和设计要求,状态模式在gof的定义如下:

 

 

当一个状态的内部状态改变时允许改变其行为,这个对象看起来改变了其类;

 

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

 

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

 

 

example:

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

* 帐户(Account)分为普通帐户,VIP帐户和信用卡帐户三种.

* 每个帐户都可以执行取钱,存钱,注销三种操作

* 关于取钱操作的细节:
普通帐户每次取钱限额为1000元,不能透支
VIP帐户每次取钱限额为3000元,不能透支
信用卡帐户每次取钱限额为3000元,可以透支

* 另外每个帐户有四种可能的状态:新建、正常、冻结、挂失

* 帐号处于不同状态时对于上面提到的三种操作会产生影响:
新建状态时不能执行注销操作
挂失状态时不能执行存钱、取钱操作
冻结状态时不能执行存钱、取钱、注销操作

这是简单的需求,在设计时,

* 我将帐户设置为抽象类(Account),普通帐户,VIP帐户和信用卡帐户为其子类

* 使用状态模式管理帐户的四种状态,具体做法为:建立接口AccountState,其中包含取钱,存钱,注销三个方法,然后给出四个实现类,分别对应新建、正常、冻结、挂失四种状态。在Accout中保持一个对状态的引用

问题:在实现状态模式中的三个方法的时候出现了问题,以取钱为例,显然取钱时要判断当前帐号的类别,这样一来难免引入if判断,二来需要在状态类中依赖Account子类,感觉并不好,请教好的解决思路。

(为了避免代码冗余,希望能用策略模式实现取钱,存钱等方法)

 

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

>以取钱为例,显然取钱时要判断当前帐号的类别,这样一来难免引入if判断,
这个问题是因为你状态设计有些问题,我培训时一直强调:使用状态模式之前一定要搞清楚事件和状态,这个案例中,取钱是个动作,无疑是事件,目前你的状态有新建、正常、挂失、冻结和注销四个状态,其他都是事件,你必须将这四个状态设为四个状态对象,事件导致状态变化,你要分析下这四个状态的切换是依靠什么事件完成的。

象取钱这样的事件,我目前发现不能造成上述四个状态的切换,所以,取钱应该写在普通的业务层里面,当然,为了封装只有正常状态才可以取钱这个规则,你可以在状态模式基础上再封装一层规则策略层,在其中将取钱规则写入,外部客户端调用时,只需传入事件特征如取钱,然后获得结果:要么正常;要么返回特定Exception,无法取钱。

至于if else只是一个设计结果的体现,可能会在规则策略层也用到if else,但是这时我的if else已经是一个非常简单,粒度很小的判断了,这就达到设计目的了。

希望对你有帮助。


二来需要在状态类中依赖Account子类,感觉并不好,

0
0
分享到:
评论

相关推荐

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

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

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

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

    策略模式(Strategy Pattern)详解 1. 什么是策略模式? 2. 为什么需要策略模式? 3. 策略模式的核心概念 3.1 策略(Strategy) 3.2 具体策略(Concrete S

    8.1 策略模式 vs 状态模式 8.2 策略模式 vs 命令模式 8.3 策略模式 vs 工厂模式 8.4 策略模式 vs 模板方法模式 9. 策略模式的优缺点 9.1 优点 9.2 缺点 10. 何时使用策略模式? 10.1 实际应用场景 10.2 Java中常见的...

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

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

    设计模式之禅之 工厂方法模式+策略模式

    - **交易编号与扣款策略的对应**:采用状态模式或责任链模式来解决交易编号与扣款策略的对应问题。例如,可以将交易编号视为一种状态,当交易发生时,根据当前状态选择对应的扣款策略。 4. **实现细节**: - **...

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

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

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

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

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

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

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

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

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

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

    策略模式在android中使用

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

    headfirst 策略模式代码

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

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

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

    设计模式 策略模式

    例如,在游戏中,角色的行为可能因玩家的选择或游戏状态而变化,通过策略模式,可以轻松地切换角色的攻击策略或防御策略。 在学习策略模式时,除了理解其基本概念,还需要掌握如何在实际项目中应用和扩展。这包括...

    状态模式(State Pattern)详解 一、状态模式简介 1.1 什么是状态模式? 1.2 为什么需要状态模式? 1.3 状态模式的核心思想 二、状态模式的结构 2.1 UML类图 2.2 各个组

    7.2 状态模式与策略模式的区别 7.3 状态模式与观察者模式的区别 7.4 状态模式与责任链模式的区别 7.5 状态模式与备忘录模式的区别 7.6 状态模式与单例模式的区别 八、状态模式的适用场景与不适用场景 8.1 适用场景 ...

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

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

    设计模式——策略模式

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

    设计模式1,策略模式

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

    策略模式+观察这模式

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

    android应用开发设计模式之-策略模式

    今天我们将深入探讨其中的一种——策略模式。策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java编程语言中,尤其是在Android平台上,这种模式能够使我们的代码更加灵活、可扩展且易于维护。 ...

Global site tag (gtag.js) - Google Analytics