`

策略模式 状态模式

阅读更多

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

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)** 建造者模式是一种创建型设计模式,它允许我们分步骤构建复杂对象,而无需暴露...

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

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

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

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

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

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

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

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

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

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

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

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

    策略模式在android中使用

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

    headfirst 策略模式代码

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

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

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

    设计模式 策略模式

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

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

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

    设计模式——策略模式

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

    设计模式1,策略模式

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

    策略模式+观察这模式

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

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

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

    策略(strategy)模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 在策略模式中,我们创建表示各种策略的对象和一个行为根据...

    java实验策略模式观察者模式和组合模式.pdf

    Java 实验策略模式、观察者模式和组合模式 在本实验中,我们将学习和掌握策略模式、观察者模式和组合模式,并使用 Java 语言实现这些模式。这些模式是面向对象编程的重要组成部分,能够帮助我们设计和实现更加灵活...

Global site tag (gtag.js) - Google Analytics