`
Ivan_Pig
  • 浏览: 386693 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

DesignPattern学习------State与Strategy

阅读更多
状态模式(State)
定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
用途:主要解决当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化!

定义依然的让人迷惑不解!如果说,状态模式就是为了替换复杂的if...else语句的,是否会有点恍然大悟的感觉?
我现在对状态模式的理解是这样的,一个类里面有过于复杂的if...else,维护起来很不方便,如果哪里有问题了,要维护一大块代码,而如果有新的条件了,则需要修改这一大段的代码。状态模式就是为了解决这个问题的。
假设有如下一段代码。
public class Find {
    public void find(int id) {
        if (id == 1) {
            System.out.println("1");
        } else if (id == 2) {
            System.out.println("2");
        } else if (id == 3) {
            System.out.println("3");
        } else if (id == 4) {
            System.out.println("4");
        }
    }
}

如果判断里面的业务比较麻烦的话,那么这段代码就很复杂了。而如果可能需求又变了,还要判断id == 5,又要找到这段代码来修改。
看看状态模式的写法,在这里,一个判断就是一个所谓的状态,符合这个状态就执行相应的动作,否则就进入下一个状态。可以想象,每个状态都有统一的接口。
public interface State {
    public void execute(Find find,int id);
}

修改Find
public class Find {
    private State state;

    public void setState(State state) {
        this.state = state;
    }

    public Find(State state) {
        this.state = state;
    }

    public void stateFind(int id) {
        state.execute(this, id);
    }
}

再看State的子类怎么写。
public class State1 implements State{
    public void execute(Find find,int id) {
        if(id == 1){
            System.out.println("1");
        }else{
            find.setState(new State2());
            find.stateFind(id);
        }
    }
}

public class State2 implements State {
    public void execute(Find find, int id) {
        if(id == 2){
            System.out.println("2");
        }else{
            find.setState(new State3());
            find.stateFind(id);
        }
    }
}

public class State3 implements State {
    public void execute(Find find, int id) {
        if(id == 3){
            System.out.println("3");
        }else{
            find.setState(new State3());
            find.stateFind(id);
        }
    }
}

测试
public class FindTest {
    Find find;

    @Before
    public void init(){
        find = new Find(new State1());
    }

    @Test
    public void testFind() throws Exception {
        find.stateFind(3);
    }
}

如果需要修改各个状态所对应的行为,到相应的类里面就可以了。如果要添加状态,实现State接口,然后依次加上去即可。类似链表了。
缺点显而易见,类太多了。。。。

策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
用途:在不同时间需要应用不同的业务规则的时候,就可以考虑使用策略模式。

这个定义,我依然理解不了(可能智商不够高

我的理解是,就代码上而言,策略模式和状态模式区别很小。状态模式是在内部判断,而策略模式是外部传入行为,直接去执行行为,而不需要再判断状态了。

修改代码如下:
public interface State {
    public void execute();
}

public class State1 implements State {
    public void execute() {
        System.out.println("1");
    }
}

public class State2 implements State {
    public void execute() {
        System.out.println("2");
    }
}

public class State3 implements State {
    public void execute() {
        System.out.println("3");
    }
}


public class Find {
    private State state;

    public Find(State state) {
        this.state = state;
    }

    public void stateFind() {
        state.execute();
    }
}

测试
public class FindTest {
    Find find;

    @Before
    public void init(){

    }

    @Test
    public void testTotal(){
        find = new Find(new State1());
        find.stateFind();
        find = new Find(new State2());
        find.stateFind();
        find = new Find(new State3());
        find.stateFind();
    }
}


刚开始好好研究模式,欢迎拍砖!


分享到:
评论
4 楼 Ivan_Pig 2009-02-13  
状态模式的耦合比较高,是各个State之间的耦合,这个好像是没办法的,因为要传递逻辑的。
但是比if...else符合开闭原则
3 楼 8000 2009-02-13  
你这两个类如次强烈的依赖在一起,还不如使用if else.

2 楼 wdlfellow 2009-02-13  
state模式个人使用不多
优点是职责放在类中,替代if else 的函数式编程,从而更符合OOP的思想,提高了代码的可维护性,因为采用state模式对原有代码的修改更少,虽然会增加新的类。

strategy模式用过几次
在报表文件导出时,提供excel,pdf,html等方式
对数据进行加密时,支持多种加密算法,这些似乎都可以用到策略模式,但在简单的应用系统里优点不明显。

GOF前辈多年经验的总结,还是要理解再理解,在实践中思考
1 楼 hoorace 2009-02-11  
state模式和strategy模式 在head frist教程中的定义一直都不能很好的理解,主要平时编码过程中大部分都在用 factory模式。

相关推荐

    design-pattern-java.pdf

    处理对象的多种状态及其相互转换——状态模式(五) 处理对象的多种状态及其相互转换——状态模式(六) 策略模式-Strategy Pattern 算法的封装与切换——策略模式(一) 算法的封装与切换——策略模式(二) 算法的...

    java-design-patterns-master_JAVAdesignpattens_java_design_

    这个压缩包“java-design-patterns-master”显然是一个专注于Java设计模式的学习资源,旨在帮助开发者深入理解和应用这些模式。下面我们将详细探讨Java设计模式及其在实际开发中的应用。 1. **单例模式(Singleton...

    JAVA design pattern-java设计模式

    行为型模式关注对象之间的通信和责任分配,如命令(Command)、解释器(Interpreter)、迭代器(Iterator)、中介者(Mediator)、备忘录(Memento)、观察者(Observer)、状态(State)、策略(Strategy)、模板...

    DesignPattern-master.zip

    "DesignPattern-master.zip"这个压缩包很可能包含了一个关于设计模式的项目或教程资源,用于学习和理解各种设计模式。 在这个“DesignPattern-master”目录中,我们可以期待找到不同类型的资源,如源代码示例、解释...

    Unity-Design-Pattern-master.zip.zip

    本资料“Unity-Design-Pattern-master.zip”聚焦于将设计模式应用于Unity游戏开发,通过实例解析,帮助开发者提升代码质量和可维护性。 在Unity中,设计模式的应用有助于优化项目结构,提高代码复用,以及更好地...

    design-pattern-Java设计模式

    行为型模式如策略(Strategy)、模板方法(Template Method)、观察者(Observer)、命令(Command)、迭代器(Iterator)、访问者(Visitor)、备忘录(Memento)、状态(State)、职责链(Chain of Responsibility...

    C++11全套设计模式-23种指针的用法(a full DesignPattern -DesignPattern.zip

    本资料包“DesignPattern - DesignPattern.zip”提供了对C++11中23种设计模式的全面讲解,特别是结合指针使用的部分,以下是对这些知识点的详细阐述: 1. **单例模式(Singleton)**:确保一个类只有一个实例,并...

    Design Pattern英文版

    设计模式(Design Pattern)是软件工程中的一种经验总结,它是在特定上下文中为解决常见问题而提出的一套可复用的解决方案。设计模式并不直接实现为代码,而是提供了一种在面向对象设计中如何处理常见问题的指南。...

    23种设计模式的C++实现DesignPattern-master.zip

    本资源"23种设计模式的C++实现DesignPattern-master.zip"包含了以下设计模式的C++实现: 1. **创建型模式**: - **单例模式(Singleton)**:保证一个类只有一个实例,并提供全局访问点。 - **工厂方法模式...

    Design Pattern 简明手册

    ### Design Pattern 简明手册知识点详述 #### 一、接口型(interface)模式 **1. Adapter(适配器模式)** - **定义**:允许一个类接口与另一个不兼容的类接口协同工作。 - **分类**: - **继承型Adapter**:通过...

    design-pattern-in-java

    这个"design-pattern-in-java"项目中的代码示例涵盖了以上所有设计模式,通过实际的Java代码,你可以更直观地理解这些模式的工作原理,并学习如何在自己的项目中应用它们。设计模式的掌握对于提升代码质量、可维护性...

    良葛格DesignPattern学习笔记

    良葛格的《Design Pattern学习笔记》不仅涵盖了经典的GOF设计模式,还额外介绍了几种多线程模式,这使得这份学习笔记成为了一个宝贵的学习资源。下面将对其中的部分设计模式进行详细介绍。 #### 二、GOF设计模式 ...

    designpattern.zip

    本资源"designpattern.zip"包含了对Java中23种经典设计模式的详细讲解和代码实例,对于中高级Java工程师来说,是提升开发技能的必备学习材料。 设计模式通常分为创建型、结构型和行为型三大类。创建型设计模式关注...

    Head First Design Pattern

    例如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录模式(Memento)、状态模式(State)、职责链...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) 生成...

    design pattern PPT

    设计模式(Design Pattern)是软件工程中用于解决软件设计问题的既定方案。设计模式并非直接的代码实现,而是一套被验证过的通用解决方案模板。它们是由经验丰富的软件开发者总结出的,在特定上下文中对常见问题的...

    JAVA software design pattern

    17. **策略模式(Strategy)**:定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户。 18. **模板方法模式(Template Method)**:在一个方法中定义一个算法的骨架,而将...

    Gof design pattern 中文/英文版+web+学习笔记

    18. **状态模式(State)**:允许对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 19. **策略模式(Strategy)**:定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让...

    DesignPattern-85

    "DesignPattern-85"项目显然关注的是设计模式的学习和应用,特别是与Java编程语言相关的实现。在这个项目中,作者旨在记录自己对设计模式的理解,并分享如何更高效地运用这些模式来优化代码。 首先,我们来讨论设计...

    设计模式 - Design Pattern

    "Design Pattern"这个压缩包文件很可能包含了一些关于设计模式的实例和文档,特别是提到了"design-pattern\doc\api"目录下的"index.html",这可能是一个交互式的文档或者教程,通过实例帮助开发者更好地理解设计模式...

Global site tag (gtag.js) - Google Analytics