首页 > 其他 > 详细

(十七)状态模式-代码实现

时间:2016-03-04 19:06:17      阅读:93      评论:0      收藏:0      [点我收藏+]

介绍

首先明白两个单词:打开和关闭是同一个物体的两种状态,是需要经常互相切换的,不是没有关系的两个单词. let`s Go

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

应用场景:经常切换状态去做一些事情的时候,如在不同的天气做事的方式,穿的衣服不同. 画图工具不同的工具执行的事件效果不同.

好处:一次改变,处处使用

 

状态模式的实现方式多种多样,有时候仅仅是符合状态的一点规则,也可以成为状态模式.下面我用两个例子说明,第一个是典型的状态模式,第二个是比较模糊的状态模式

典型的状态模式例子

代码:

//状态接口

 

package note.com.state;

/**
 * 状态接口定义
 * @author lxz
 *
 */
public interface State {
    public State changeState();
    public void doOne();
    public void doTwo();
    public void doThree();
}

//具体状态

package note.com.state;

public class Open implements State{

    
    public State changeState() {
        return new Connect();
    }

    public void doOne() {
        System.out.println("事件一:打开状态执行");
        
    }

    public void doTwo() {
        System.out.println("事件二:打开状态执行");
        
    }

    public void doThree() {
        System.out.println("事件三:打开状态执行");
    }

    
}
package note.com.state;

public class Connect implements State{

    
    public State changeState() {
        return new Close();
    }

    public void doOne() {
        System.out.println("事件一:连接状态执行");
        
    }

    public void doTwo() {
        System.out.println("事件二:连接状态执行");
        
    }

    public void doThree() {
        System.out.println("事件三:连接状态执行");
    }

    
}
package note.com.state;

public class Close implements State{

    
    public State changeState() {
        return new Open();
    }

    public void doOne() {
        System.out.println("事件一:关闭状态执行");
        
    }

    public void doTwo() {
        System.out.println("事件二:关闭状态执行");
        
    }

    public void doThree() {
        System.out.println("事件三:关闭状态执行");
    }

    
}

//根据状态来执行具体操作的类

package note.com.state;

public class Context {
    private State state = null;

    public Context(){
        state = new Open();
    }
    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }
    
    public void execute(){
        state.doOne();
        state.doTwo();
        state.doThree();
        state = state.changeState();
    }
    
}

//测试类

package note.com.state;

public class StateTest {
    public static void main(String[] args) {
        Context context = new Context();
        context.execute();
        context.execute();
        context.execute();
        context.execute();
    }
}

结果:

事件一:打开状态执行
事件二:打开状态执行
事件三:打开状态执行
事件一:连接状态执行
事件二:连接状态执行
事件三:连接状态执行
事件一:关闭状态执行
事件二:关闭状态执行
事件三:关闭状态执行
事件一:打开状态执行
事件二:打开状态执行
事件三:打开状态执行

这个例子非常切合概念,有明显的状态内部的切换,有状态改变后的不同事件

 

 

模糊的状态模式例子

 

代码:

 

//工具基类

package note.com.state;

/**
 * 工具基类
 * @author lxz
 *
 */
public abstract class ATool {

    public abstract void leftMouseClick();
    
    public abstract void rightMouseClick();
    
    public abstract void leftDoubleMouseClick();
    
}

//具体工具类

package note.com.state;

/**
 * 圆形工具
 * @author lxz
 *
 */
public class Circle extends ATool{

    @Override
    public void leftMouseClick() {
        System.out.println("界面出现了一个圆");
        
    }

    @Override
    public void rightMouseClick() {
        System.out.println("界面出现了圆形的属性菜单");
        
    }

    @Override
    public void leftDoubleMouseClick() {
        System.out.println("界面出现了一个圆");
        System.out.println("界面出现了一个圆");
        
    }

}
package note.com.state;

/**
 * 油漆桶工具
 * @author lxz
 *
 */
public class PaintKettle extends ATool{

    @Override
    public void leftMouseClick() {
        System.out.println("界面出现了填充颜色");
        
    }

    @Override
    public void rightMouseClick() {
        System.out.println("界面出现了油漆桶的属性菜单");
        
    }

    @Override
    public void leftDoubleMouseClick() {
        System.out.println("界面出现了填充颜色,颜色更深了");
    }

}
package note.com.state;

/**
 * 画笔工具
 * @author lxz
 *
 */
public class Pen extends ATool{

    @Override
    public void leftMouseClick() {
        System.out.println("界面出现了一个点");
        
    }

    @Override
    public void rightMouseClick() {
        System.out.println("界面出现了画笔工具的属性菜单");
        
    }

    @Override
    public void leftDoubleMouseClick() {
        System.out.println("界面出现了一个点");
        
    }

}
package note.com.state;

/**
 * 矩形工具
 * @author lxz
 *
 */
public class Rectangle extends ATool{

    @Override
    public void leftMouseClick() {
        System.out.println("界面出现了一个矩形");
        
    }

    @Override
    public void rightMouseClick() {
        System.out.println("界面出现了矩形工具的属性菜单");
        
    }

    @Override
    public void leftDoubleMouseClick() {
        System.out.println("界面出现了一个矩形");
        System.out.println("界面出现了一个矩形");
    }

}

//画图工具界面类

package note.com.state;

/**
 * 管理工具的界面
 * 
 * @author lxz
 *
 */
public class UI {
    private ATool tool = new Pen();// 默认是画笔工具
    public static final int PEN = 1;
    public static final int RECTANGLE = 2;
    public static final int CIRCLE = 3;
    public static final int PAINTKETTLE = 4;
    
    public  UI() {
        System.out.println("画图工具已经启动");
    }
    
    /*
     * 切换工具(状态)
     */
    public void changeTool(int toolNum) {
        switch (toolNum) {
        case PEN:
            tool = new Pen();
            break;
        case RECTANGLE:
            tool = new Rectangle();
            break;
        case CIRCLE:
            tool = new Circle();
            break;
        case PAINTKETTLE:
            tool = new PaintKettle();
            break;
        default:
            tool = new Pen();
            break;
        }
    }
    
    public void leftMouseClick(){
        tool.leftMouseClick();
    }
    
    public void rightMouseClick(){
        tool.rightMouseClick();
    }
    
    public void leftDoubleMouseClick(){
        tool.leftDoubleMouseClick();
    }

}

 

//测试类

package note.com.state;

public class ToolTest {
    public static void main(String[] args) {
        System.out.println("启动画图工具......");
        UI ui = new UI();//启动画图工具
        System.out.println("点击画笔工具......");
        ui.changeTool(UI.PEN);//点击画笔工具
        System.out.println("左键点击画板......");
        ui.leftMouseClick();//左键点击画板
        System.out.println("点击圆形工具......");
        ui.changeTool(UI.CIRCLE);//点击圆形工具
        System.out.println("左键双击画板......");
        ui.leftDoubleMouseClick();//左键双击画板
        
    }
}

 

结果:

启动画图工具......
画图工具已经启动
点击画笔工具......
左键点击画板......
界面出现了一个点
点击圆形工具......
左键双击画板......
界面出现了一个圆
界面出现了一个圆

 

根据选择的工具(状态)不同,执行的操作相应也不同,具有一次改变,次次使用的效果.注意:本例中没有体现状态本身实现切换的功能,而是由用户来切换.

 

(十七)状态模式-代码实现

原文:http://www.cnblogs.com/qinggege/p/5243027.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!