选用了一个假设需要用户验证的例子进行State模式学习,这个例子并不恰当。无所谓了,只要能学习到其中的内容即可。

适用性:

1,一个对象的行为取决于他的状态,并且它必须在运行时刻依据状态改变他的行为。

2,一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用于一个或多个枚举表示。通常,多个操作句包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以依据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而对立变化。

下面的代码只针对于1点,第2点还未研究。

/**

 * state基类

 * @author jevan

 * @version (1.0 at 2013-7-4)

 */

public abstract class State {

    

    

    protected void changeState(Auth a, State state) {

        a.changeState(state);

    };

    

    abstract public boolean doAuth(Auth auth,String path);

}

下面是三个子类:

/**

 * auth之前的本机检查

 * @author jevan

 * @version (1.0 at 2013-7-4)

 */

public class LocalCheckState extends State {

    protected static State instance = null;

    public static State getState() {

        if (instance == null)

            instance = new LocalCheckState();

        return instance;

    }

    /**

     * 检查software的身份id是否有效。

     * @param url

     * @return

     */

    private boolean checkID( ) {

        return true;

    }

    @Override

    public boolean doAuth(Auth auth, String path) {

        //check auth data

        if (!checkID()) {

            return false;

        }

        changeState(auth, NetCheckState.getState());

        return true;

    }

}

/**

 * 认证之前的ping检查

 * @author jevan

 * @version (1.0 at 2013-7-4)

 */

public class NetCheckState extends State {

    protected static State instance = null;

    public static State getState() {

        if (instance == null)

            instance = new NetCheckState();

        return instance;

    }

    /**

     * 本地网络检查

     * 

     * @return

     */

    private boolean isConnect() {

        // 1,检查网卡连接状态

        // 2,检查ip是否有效

        return true;

    }

    /**

     * ping下外网是否可用。

     * 

     * @return

     */

    private boolean isUsed() {

        return true;

    }

    @Override

    public boolean doAuth(Auth auth, String path) {

        if (!isConnect()) {

            return false;

        }

        if (!isUsed()) {

            return false;

        }

        

        changeState(auth, AuthState.getState());

        return true;

    }

}

/**

 * 最终认证类

 * @author jevan

 * @version (1.0 at 2013-7-4)

 */

class AuthState extends State {

    protected static State instance = null;

    public static State getState() {

        if(instance == null)

            instance = new AuthState();

        return instance;

    }

    /**

     * 由给定的url获取数据。

     * @param url

     * @return

     */

    private String getAuthData(String url)

    {

        return "acb";

    }

    

    /* (non-Javadoc)

     * @see State#doAuth(Auth)

     */

    @Override

    public boolean doAuth(Auth auth,String path) {

        

        if(!getAuthData(path).equals("abc"))

        {

            return false;

        }

        return true;

    }

}

auth的认证类:

/**
 * 认证类
 * @author jevan
 * @version (1.0 at 2013-7-4)
 */
public class Auth {
    private State mState;     public Auth()
    {
        mState = LocalCheckState.instance;
    }
    public boolean check()
    {
        mState = LocalCheckState.instance;
        /**
         * 其实可以对State基类进行细分;
         * 网络State、认证State。选取的这个例子并不适合用State模式(子状态太多)。
         */
        mState.doAuth(this, null);
        return true;
    }
    
    public boolean doAuth(String url)
    {
        mState.doAuth(this,url);
        return true;
    }
    
    
    public void changeState(State state)
    {
        mState = state;
    } }

用户类,使用例子:

/**
 * 用户类,使用实例。
 * @author jevan
 * @version (1.0 at 2013-7-4)
 */
public class User {      Auth auth = new Auth();
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        new User().doAuth("www.abc.com/auth");
    }
    
    public  boolean doAuth(String path)
    {
        if(auth.check())
        {
            return false;
        }
        if(!auth.doAuth(path))
        {
            return false;
        }
        return true;
    }
    
}

插入个图:

State模式学习笔记的更多相关文章

  1. SQL反模式学习笔记1 开篇

    什么是“反模式” 反模式是一种试图解决问题的方法,但通常会同时引发别的问题. 反模式分类 (1)逻辑数据库设计反模式 在开始编码之前,需要决定数据库中存储什么信息以及最佳的数据组织方式和内在关联方式. ...

  2. SQL反模式学习笔记5 外键约束【不用钥匙的入口】

    目标:简化数据库架构 一些开发人员不推荐使用引用完整性约束,可能不使用外键的原因有一下几点: 1.数据更新有可能和约束冲突: 2.当前的数据库设计如此灵活,以至于不支持引用完整性约束: 3.数据库为外 ...

  3. SQL反模式学习笔记3 单纯的树

    2014-10-11 在树形结构中,实例被称为节点.每个节点都有多个子节点与一个父节点. 最上层的节点叫做根(root)节点,它没有父节点. 最底层的没有子节点的节点叫做叶(leaf). 中间的节点简 ...

  4. SQL反模式学习笔记2 乱穿马路

    程序员通常使用逗号分隔的列表来避免在多对多的关系中创建交叉表, 将这种设计方式定义为一种反模式,称为“乱穿马路”. 目标:  存储多属性值,即多对一 反模式:将多个值以格式化的逗号分隔存储在一个字段中 ...

  5. SQL反模式学习笔记4 建立主键规范【需要ID】

    目标:建立主键规范 反模式:每个数据库中的表都需要一个伪主键Id 在表中,需要引入一个对于表的域模型无意义的新列来存储一个伪值,这一列被用作这张表的主键, 从而通过它来确定表中的一条记录,即便其他的列 ...

  6. SQL反模式学习笔记6 支持可变属性【实体-属性-值】

    目标:支持可变属性 反模式:使用泛型属性表.这种设计成为实体-属性-值(EAV),也可叫做开放架构.名-值对. 优点:通过增加一张额外的表,可以有以下好处 (1)表中的列很少: (2)新增属性时,不需 ...

  7. SQL反模式学习笔记7 多态关联

    目标:引用多个父表 反模式:使用多用途外键.这种设计也叫做多态关联,或者杂乱关联. 多态关联和EAV有着相似的特征:元数据对象的名字是存储在字符串中的. 在多态关联中,父表的名字是存储在Issue_T ...

  8. SQL反模式学习笔记8 多列属性

    目标:存储多值属性 反模式:创建多个列.比如一个人具有多个电话号码.座机号码.手机号码等. 1.查询:多个列的话,查询时可能不得不用IN,或者多个OR: 2.添加.删除时确保唯一性.判断是否有值:这些 ...

  9. SQL反模式学习笔记9 元数据分裂

    目标:支持可扩展性.优化数据库的结构来提升查询的性能以及支持表的平滑扩展. 反模式:克隆表与克隆列 1.将一张很长的表拆分成多张较小的表,使用表中某一个特定的数据字段来给这些拆分出来的表命名. 2.将 ...

随机推荐

  1. 《剑指offer》— JavaScript(18)二叉树的镜像

    二叉树的镜像 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 相关知识 二叉树的镜像定义: 源二叉树 镜像二叉树 思路 有关二叉树的算法问题,一般都可以通过递归来解决.那么写一个正确的递归程序 ...

  2. UU农场平台开发 UU农场拆复利系统

    UU农场平台开发 UU农场拆复利系统今年比较新的一款游戏,类似于QQ农场,但又加入了很多新型的互联网理财模式!UU农场平台开发 UU农场拆复利系统.UU农场开发.UU农场游戏平台开发.UU农场平台开发 ...

  3. 【Zookeeper】源码分析之请求处理链(三)

    一.前言 在分析了PrepRequestProcessor处理器后,接着来分析SyncRequestProcessor,该处理器将请求存入磁盘,其将请求批量的存入磁盘以提高效率,请求在写入磁盘之前是不 ...

  4. flume-sink报错 java.lang.IllegalStateException: close() called when transaction is OPEN - you must either commit or rollback first

    1. 确认代码无误(根据情况修改,表示若获得不了数据不会自动commit或者rollback): Event event = channel.take(); if (event == null) { ...

  5. Spring IoC介绍与Bean的使用

    1. 介绍 IoC   IoC-Inversion of Control,即"控制反转",它不是什么技术,而是一种设计思想.在 Java 开发中, IoC意味着将设计好的对象交给容 ...

  6. [bzoj3196]Tyvj 1730 二逼平衡树——线段树套平衡树

    题目 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查 ...

  7. Boot Sector - Hello world

    1. code bits org 7c00h mov ax, cs mov ds, ax mov es, ax call DispStr jmp $ DispStr: mov ax, BootMess ...

  8. 开始了大概三四天的Rails学习之路

    最近因为一位极光推送朋友,我开始了大概三四天的Rails学习之路,最终达到的水平是可以比较轻松地做出大部分功能,然后自我感觉可以自如地按照Rails的设计思想去思考.由于编程的日益流行,我结识了越来越 ...

  9. dll

    dll可以有一个入口点函数,系统会在不同的时候调用这个入口函数.这个调用是通知性质的,通常被dll用来执行一些与进程或线程有关的初始化和清理工作如果将dll的入口点函数命名为DllMain之外的其他名 ...

  10. Python3.5 numpy,scipy,安装

    不是特别难,先保证环境变量正确配置 首先,安装了VS2015; 第二,在Python3.5安装路径中有一个Scripts文件夹,里面有pip.exe或者类似的可执行文件,安装一下: 第三,下载相对应的 ...