设计模式小议:state【转】
转自:https://blog.csdn.net/goodboy1881/article/details/635963
这个模式使得软件可以在不同的state下面呈现出完全不同的特征
不同的theme使得相同的元素呈现出不同的特点
不同的state下面相同的操作产生不同的效果
不同的状态对相同的信息产生不同的处理
这个模式使得操作的state逻辑更加的清楚,省去了无数的state判断,而state的扩展性和可维护性和执行效率也大幅度的上升。关于state,有如下几点要注意的地方:
所有的state应该被一个类(State Manager Class)管理:
state之间的跳转和转换是非常复杂的,有时一些state可能要跳转的目标state有几十个,这个时候我们需要一个管理类(State Manager )来统一的管理这些state的切换,例如目标state的初始化和申请跳转state的结束处理,以及一些state间共享数据的存储和处理。与其称这 个Manager 为管理类,不如说是一个中间类,它实现了state之间的解隅,使得各个state之间不比知道target state的具体信息,而只要向Manager申请跳转就可以了。使得各个state的模块化更好,更加的灵活
所有的state都应该从一个state基类继承:
既然state要教给一个manager来管理,那么自然的,这些state都应该从一个父类继承下来,这样manager并不需要知道很多子类的 信息,一个最单纯的manager只要只要管理一个这样的基类的指针就可以了。另外,我们还可以统一的把state的一些共有的属性放在这里
state应该实现为一个singleton:
state并不需要总是被申请,这样可能会造成管理上的混乱,state资源的申请也不应该可以任意进行,事实上,state的申请权限应该只有 Manager才有,并且有且只有一次。在这样的情况下,state的构造函数似乎应该被声明为protected or private ,而Manager应该被声明为state的友元,但是友元被看成是破坏类的封装性的一种做法,这一点上,我很矛盾,所以在这一条上我只能采取一种漠视的 态度。
应该做一个state么?这是一个问题:
state可以说是if-else的一种替代品,极端的情况下面state可以让你的程序中if-else程序块消失得无影无踪,但是,这并不是银 弹。state对于状态可预知的情况下非常有效,但是对于state不可预知,或者相似的state数量太多。过多的state会造成class的粒度过 细,程序反而不简洁。在这样的情况下,你应该考虑使用if-else程序块来替代state。
例如:
有这样的一个程序,它可以生成任意形状的多边形,而多边形的各个节点是可以移动的,问题就来了。
我并不知道用户将要使用多少个节点的多边形,因此我无法的创建那么多相应的state来使得这样一个程序正常工作。state大多数都是确定的,对于不确定的,state似乎无能为力,例如此例
一种解决方法是我利用Manager传递给state一个state参数,让state有机会知道用户的操作意图,在这个例子里面是让state知 道用户打算操作某一个节点,而state根据这个state参数来处理用户的操作,比如说,state得到的是用户操作的某一个点的index ,而state只要写
points[index].moveTo(points[index].getX()+offset_x , points[index].getY()+offset_y);
就可以,从而避免了state过多出现的问题
---------------------
作者:积木
来源:CSDN
原文:https://blog.csdn.net/goodboy1881/article/details/635963
版权声明:本文为博主原创文章,转载请附上博文链接!
最新文章
- 《learning hard C#学习笔记》读书笔记(20)异步编程
- winform窗体弹出时,光标默认显示在指定的输入框内
- 判断横屏竖屏,然后CSS重新计算
- zoj1492 最大团
- SpringMVC框架的工作原理
- 【翻译十四】java-并发之保护块儿
- Spark MLlib之协同过滤
- Java集合框架(JCF)之collention
- NSString字符操作
- oh-my-zsh配置 alias 指定指令别名
- JSONP跨域的原理解析(转)
- Android开发手记(21) 遍历文件夹
- javascript language
- 海康SDK编程指南(C#二次开发版本)
- 高级Bash脚本编程指南(27):文本处理命令(三)
- JDK8 HashMap 源码解析
- Ionic 2 开发(一)_安装与目录结构
- android开源框架讲解 一 butterknif
- C# Redis缓存过期实现延迟通知实战演练
- [ios]iOS8 定位
热门文章
- Jmeter(二)响应内容乱码解决办法
- 动态内存的分配(new delete malloc free)
- Python学习笔记5 【转载】基本矩阵运算_20170618
- Mybatis环境搭建(二)
- luoguP2597 [ZJOI2012]灾难
- version_compare ()
- hdu 6495 dp
- QAxBase: Error calling IDispatch member LineStyle: Unknown error
- vue使用--环境搭建与基本项目创建说明
- 数据仓库009 - SQL命令实战 - where GROUP BY join 部门综合案例