state-对象行为型模式

1.意图

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

 

2.描述

状态模式最典型的案例就是传说中的TCP网络连接案例,网络连接有三个状态,连接已建立,正在监听,连接已关闭。当对象处于不同的状态时候可以做出不同的行为。

 

state模式其实跟strategy模式非常的像。以至于网上都有对这两种模式的集中讨论。已我浅薄的理解认为state由于首先关注的是对象状态,然后再关注其行为,所以在代码实现的时候,需要由谁定义状态的转换是个关键点。目前的网上大部分代码都是通过state子类自身来定义后继状态,不过这个引起的一点是子类之间产生了依赖关系,如果增加一个状态,可能会需要修改原来的子类之间的状态转换代码。

 

3.例子简介

     关于此模式,其实具体上来说比较明确,也不多说,这个是我根据别人的例子写的一段小代码。也就是几个颜色状态之间切换来切换去的小玩意而已,如果例子不对或有误,请指正:

 

4.  思考

下面的类是对四种颜色状态之间的切换,Red,Green,Black,Blue,如果增加一个颜色Yellow状态,并不像设计模式书里写的直接增加一个子类就可以了,因为由于我下面实现的方式中状态时通过子类来切换的,所以感觉还是要修改个别状态的切换代码才行。

 

     所以最后的感觉使用优势是:

     1.解决了if.switch语句的泛滥,使代码简洁了点,但是类多了貌似阅读起来需要查各个类,所以最后阅读方便不方便还是看人而议。

     2.状态转换显示化,其实这个还是要看类的命名是否够明确,否则此优势不明显。

     其它优势还等将来更深入的体会才能写,或者等大侠补充嘿嘿~

 

-----------------------------------------------------------分割线----------------------------------------------------------------------------

     给出例子:

 

     状态的基类:

package com.gof.chapter5.state.color;

import java.awt.Color;

 

public abstract class State {

public abstract void handlepPush(Context c);

public abstract void handlePull(Context c);

public abstract Color getcolor();

 

     四种状态切换类:

 

     ===================RedColor.java=====================

package com.gof.chapter5.state.color; import java.awt.Color; public class RedColor extends State{ private static State redColor = null; @Override public Color getcolor() { // TODO Auto-generated method stub return Color.red; } @Override public void handlePull(Context c) { // TODO Auto-generated method stub c.changeState(BlackColor.instance()); } @Override public void handlepPush(Context c) { // TODO Auto-generated method stub c.changeState(BlueColor.instance()); } public static State instance() { // TODO Auto-generated method stub if(redColor == null)redColor=new RedColor(); return redColor; } }

 

 

===================BlueColor.java=====================

package com.gof.chapter5.state.color;

import java.awt.Color;

public class BlueColor extends State{

private static State blueColor = null;

 

@Override

public Color getcolor() {

// TODO Auto-generated method stub

return Color.blue;

}

 

@Override

public void handlePull(Context c) {

// TODO Auto-generated method stub

c.changeState(RedColor.instance());

}

 

@Override

public void handlepPush(Context c) {

// TODO Auto-generated method stub

c.changeState(GreenColor.instance());

}

 

public static State instance() {

// TODO Auto-generated method stub

if(blueColor == null)blueColor = new BlueColor();

return blueColor;

}

}

===================BlackColor.java=====================
package com.gof.chapter5.state.color;
import java.awt.Color;
private static State blackColor = null;
@Override
public Color getcolor() {
// TODO Auto-generated method stub
return Color.black;
}
@Override
public void handlePull(Context c) {
// TODO Auto-generated method stub
c.changeState(GreenColor.instance());
}
@Override
public void handlepPush(Context c) {
// TODO Auto-generated method stub
c.changeState(RedColor.instance());
}
public static State instance() {
// TODO Auto-generated method stub
if(blackColor == null)blackColor = new BlackColor();
return blackColor;
}
===================GreenColor.java=====================
package com.gof.chapter5.state.color;
import java.awt.Color;
public class GreenColor extends State{
private static State greenColor = null;
@Override
public Color getcolor() {
// TODO Auto-generated method stub
return Color.green;
}
@Override
public void handlePull(Context c) {
// TODO Auto-generated method stub
c.changeState(BlueColor.instance());
}
@Override
public void handlepPush(Context c) {
// TODO Auto-generated method stub
c.changeState(BlackColor.instance());
}
public static State instance() {
// TODO Auto-generated method stub
if(greenColor == null)greenColor = new GreenColor();
return greenColor;
}
}
        
      context类,也就是控制类
package com.gof.chapter5.state.color;
import java.awt.Color;
public class Context {
private State _state;
public Context(){
//假设起始状态就是Color.RED
this._state = new RedColor();
}
public void handlePush(){
this._state.handlepPush(this);
}
public void handlePull(){
this._state.handlePull(this);
}
public String getColor(){
return this._state.getcolor().toString();
}
public void changeState(State state){
this._state = state;
}
}
测试类:

 

 

package com.gof.chapter5.state.color; public class Test { public static void main(String[] ben){ Context c = new Context(); System.out.println(c.getColor()); c.handlePull(); System.out.println(c.getColor()); c.handlePull(); System.out.println(c.getColor()); c.handlePull(); System.out.println(c.getColor()); c.handlePull(); System.out.println(c.getColor()); c.handlePush(); System.out.println(c.getColor()); c.handlePush(); System.out.println(c.getColor()); c.handlePush(); System.out.println(c.getColor()); c.handlePush(); System.out.println(c.getColor()); c.handlePush(); System.out.println(c.getColor()); c.handlePush(); System.out.println(c.getColor()); } }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值