设计模式----State(状态)模式

来源:互联网 发布:c#数据库实例 编辑:程序博客网 时间:2024/05/27 09:49
 

设计模式----State(状态)模式

GoF允许一个对象在其内部状态改变时,改变他的行为。对象看起来似乎修改了它的类。

在实际的程序开发中,我们经常会用到大量的if elseif else对某种状态进行切换,特别是用惯了结构化语言(C语言)的人。如果状态切换的情况反复出现,我们就可以考虑到采用State模式来代替程序中大量的if elseif else了。在大多数情况下,如果对象的属性不同那么相应得对象的行为要求也不同。对GoF给出的定义做个通俗的解释就是:一个对象在不同的状态下有不同的行为,也可以说对象的每个状态有着不同的行为。

下面给出事例代码(我的这个事例比较简单,但是能反映出State模式的意思):

下面是UML图:

小结:

State模式和Strategy模式非常的相像,如果不仔细追究,差别不是很大。如果用不好的话很容易将State模式退化成Strategy模式。

先来一个状态:
package State;

public abstract class State
...
{
    
    
/** *//** Creates a new instance of State */
    
public State() ...{
    }

    
    
public abstract void opration();
}
//end class State

在来两个具体的State:
package State;

public class ConcreteStateA extends State
...
{
    
    
/** *//** Creates a new instance of ConcreteStateA */
    
public ConcreteStateA() ...{
    }


    
public void opration()
    ...
{
        System.out.println(
"The Concrete A");
    }
//end opration()
    
    
public static ConcreteStateA getInstance()
    ...
{
        
return new ConcreteStateA();
    }
//end getInstance()
}


package State;

public class ConcreteStateB extends State
...
{
    
    
/** *//** Creates a new instance of ConcreteStateB */
    
public ConcreteStateB() ...{
    }


    
public void opration()
    ...
{
        System.out.println(
"The Concrete B");
    }
//end operation()
    
    
public static ConcreteStateB getInstance()
    ...
{
        
return new ConcreteStateB();
    }
//end getInstance()
    
}
//end class ConcreteStateB

来一个场景:
package State;

public class Context
...
{
    
private State state;
    
/** *//** Creates a new instance of Context */
    
public Context() ...{
    }

    
    
public void setSate(State stat)
    ...
{
        state 
= stat;
    }
//end setState(...)
    
    
public void operation()
    ...
{
        state.opration();
    }
//end operation()
    
}
//end class Context

怎样调用:
package State;

public class StatePattern
...
{
    State csa;
    Context con 
= new Context();
    
    
/** *//** Creates a new instance of StatePattern */
    
public StatePattern()
    ...
{
        csa 
= ConcreteStateA.getInstance();
    }

    
    
public void showStatePattern()
    ...
{
        con.setSate(csa);
        con.operation();
        csa 
= ConcreteStateB.getInstance();
        con.setSate(csa);
        con.operation();
    }
//end showStatePattern()
    
    
public static void main(String[] args)
    ...
{
        StringBuilder ssb 
= new StringBuilder();
        ssb.append(
"The state pattern!");
        System.out.println(ssb.toString());
        StatePattern sp 
= new StatePattern();
        sp.showStatePattern();
    }
//end main(...)
    
}
//end class StatePattern