设计模式--状态模式

STATE?跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。   状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。

 
其实就是在不同类中改变类的行为,对象的行为封装在各个子类的方法里面,这个子类的行为方法来自抽象的父类或者接口的方法的不同实现。对象的行为根据对象的改变,行为发生改变。
 
举例子说明:
State.java
  1. 1 package com.soyoungboy.state;
    2 public interface State{
    3 /**
    4 * 状态对应的处理
    5 */
    6 public void handle(String sampleParameter);
    7 }

     

GrilA.java
  1. 1 package com.soyoungboy.state;
    2 public class GrilA implements State{
    3 @Override
    4 public void handle(String sampleParameter){
    5 System.out.println("GrilA want to see :"+ sampleParameter);
    6 }
    7 }

     

GrilB.java
  1. 1 package com.soyoungboy.state;
    2 public class GrilB implements State{
    3 @Override
    4 publicvoid handle(String sampleParameter){
    5 System.out.println("GrilB not want to see :"+ sampleParameter);
    6 }
    7 }

     

Context.java
  1.  1 package com.soyoungboy.state;
     2 public class Context{
     3 // 持有一个State类型的对象实例
     4 private State state;
     5 public void setState(State state){
     6 this.state = state;
     7 }
     8 /**
     9 * 用户感兴趣的接口方法
    10 */
    11 public void request(String sampleParameter){
    12 // 转调state来处理
    13 state.handle(sampleParameter);
    14 }
    15 }

     

StateModel.java --根据对象的不同,所产生的行为(request的产生结果不同)。
  1.  1 package com.soyoungboy.state;
     2 public class StateModel{// 状态模式
     3 public static void main(String[] args){
     4 test();
     5 }
     6 public static void test(){
     7 // 创建状态
     8 State state =new GrilB();
     9 State state1 =new GrilA();
    10 // 创建环境
    11 Context context =newContext();
    12 // 将状态设置到环境中
    13 context.setState(state);
    14 // 请求
    15 context.request("firm");
    16 context.setState(state1);
    17 // 请求
    18 context.request("firm");
    19 }
    20 }

     

 
结果:
GrilB not want to see :firm
GrilA want to see :firm
 
2015年12月12日19:58:59更新
貌似所有的设计模式的缺点都是增加类文件

使用场景:

比如客户端登录和登出这种不同状态的情况下不同逻辑操作的代码就可以使用状态模式去实现。

1,已经登录可以实现登陆后的操作,比如编辑个人资料,下订单

2,未登录调用编辑资料,下订单就会进入登录界面,先去进行登录

如上就是两个不同的状态类,已经登录,未登录两种状态

3,可以抽象共性的东西,比如编辑个人资料,下订单,只是在不同的状态下实现的内容不同而已,因此有1,2的不同实现。

4,状态管理类,根据设置不同的状态类来调用不同状态类里面的方法,比如编辑个人资料,下订单的逻辑。

posted @ 2015-05-24 21:32  西北野狼  阅读(263)  评论(0编辑  收藏  举报