State模式学习笔记
选用了一个假设需要用户验证的例子进行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模式学习笔记的更多相关文章
- SQL反模式学习笔记1 开篇
什么是“反模式” 反模式是一种试图解决问题的方法,但通常会同时引发别的问题. 反模式分类 (1)逻辑数据库设计反模式 在开始编码之前,需要决定数据库中存储什么信息以及最佳的数据组织方式和内在关联方式. ...
- SQL反模式学习笔记5 外键约束【不用钥匙的入口】
目标:简化数据库架构 一些开发人员不推荐使用引用完整性约束,可能不使用外键的原因有一下几点: 1.数据更新有可能和约束冲突: 2.当前的数据库设计如此灵活,以至于不支持引用完整性约束: 3.数据库为外 ...
- SQL反模式学习笔记3 单纯的树
2014-10-11 在树形结构中,实例被称为节点.每个节点都有多个子节点与一个父节点. 最上层的节点叫做根(root)节点,它没有父节点. 最底层的没有子节点的节点叫做叶(leaf). 中间的节点简 ...
- SQL反模式学习笔记2 乱穿马路
程序员通常使用逗号分隔的列表来避免在多对多的关系中创建交叉表, 将这种设计方式定义为一种反模式,称为“乱穿马路”. 目标: 存储多属性值,即多对一 反模式:将多个值以格式化的逗号分隔存储在一个字段中 ...
- SQL反模式学习笔记4 建立主键规范【需要ID】
目标:建立主键规范 反模式:每个数据库中的表都需要一个伪主键Id 在表中,需要引入一个对于表的域模型无意义的新列来存储一个伪值,这一列被用作这张表的主键, 从而通过它来确定表中的一条记录,即便其他的列 ...
- SQL反模式学习笔记6 支持可变属性【实体-属性-值】
目标:支持可变属性 反模式:使用泛型属性表.这种设计成为实体-属性-值(EAV),也可叫做开放架构.名-值对. 优点:通过增加一张额外的表,可以有以下好处 (1)表中的列很少: (2)新增属性时,不需 ...
- SQL反模式学习笔记7 多态关联
目标:引用多个父表 反模式:使用多用途外键.这种设计也叫做多态关联,或者杂乱关联. 多态关联和EAV有着相似的特征:元数据对象的名字是存储在字符串中的. 在多态关联中,父表的名字是存储在Issue_T ...
- SQL反模式学习笔记8 多列属性
目标:存储多值属性 反模式:创建多个列.比如一个人具有多个电话号码.座机号码.手机号码等. 1.查询:多个列的话,查询时可能不得不用IN,或者多个OR: 2.添加.删除时确保唯一性.判断是否有值:这些 ...
- SQL反模式学习笔记9 元数据分裂
目标:支持可扩展性.优化数据库的结构来提升查询的性能以及支持表的平滑扩展. 反模式:克隆表与克隆列 1.将一张很长的表拆分成多张较小的表,使用表中某一个特定的数据字段来给这些拆分出来的表命名. 2.将 ...
随机推荐
- 1023: [SHOI2008]cactus仙人掌图(DP+单调队列优化)
这道题吗= =首先解决了我多年以来对仙人掌图的疑问,原来这种高大上的东西原来是这个啊= = 然后,看到这种题,首先必须的就是缩点= = 缩点完之后呢,变成在树上找最长路了= =直接树形dp了 那么那些 ...
- 实例了解js面向对象的封装和继承等特点
1.面向对象特点 相比之前按照过程式写法,面向对象有以下几个特点; 1.抽象:抓住核心问题,就是将很多个方法放在一个对象上.对象由属性和方法组成,属性就是我们定义的变量,它是静态的:方法就是行为操作, ...
- .Net Core迁移到MSBuild的多平台编译问题
一.前言 本篇主要讨论.NET Core应用程序项目结构的主题,重点探索.NET Core应用程序的多平台编译问题,这里指的多平台是指.NET Framework..NET Core App..NET ...
- 0CSS样式表与HTML结合的方法
从此王子和公主幸福的生活在了一起:) 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文 ...
- XCel 项目总结 - Electron 与 Vue 的性能优化
XCEL 是由凹凸实验室推出的一个 Excel 数据清洗工具,其通过可视化的方式让用户轻松地对 Excel 数据进行筛选. XCEL 基于 Electron 和 Vue 2.0 进行开发,充分利用 E ...
- selenium 运行之后错误提示Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms. Firefox console output
错误提示: org.openqa.selenium.firefox.NotConnectedException: Unable to connect to host 127.0.0.1 on port ...
- 迷茫<第一篇:初到北京>
时光如梭,毕业四年了,遥想当年刚毕业的场景就像是昨天发生一样,这四年的人生,就是在不停的漂泊,不断的受挫.感慨良多,一言难以说尽. 2013年11月29号毕业,刚到北京的第二天我就顺利的找到了工作, ...
- java基础:数组的拼接
- github 删除远程仓库项目中的任意文件夹
今天上传代码把不需要的push上去了.结果想删除那个不想要的怎么弄都不行.网上大部分都是把那个项目整个暴力删除.那可不行啊那么多都删除.下次上传不是要命啊! 试啊试终于解决了.顺便记录一下也帮助下需要 ...
- iOS截屏保存至相册
#pragma mark 截屏并保存至相册 -(void)screenShotsComplete:(void(^)(UIImage * img)) complete { CGSize imageSiz ...