JiveJdon Community Forums
在线425人   首页   主题表   培训咨询   标签   查搜   注册    登陆 RSS
首页 » 论坛 » 设计模式、框架和架构
???en_US.forumThreadPrev.name??? 上一主题
RSS google yahoo 365Key网摘 CSDN网摘 添加到百度搜藏 POCO网摘 新浪ViVi QQ网摘
???en_US.forumThreadNext.name??? 下一主题
Go 共有 5 回复(1页) 阅读348次
 发表新帖子   回复该主题贴
tbase



发表文章: 24
注册时间: 2004年03月02日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
State模式探讨(笔记心得体会) 2004年03月14日 13:20 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
标签     
定义: 状态的切换
我的理解就是State模式可以改变对象的行为。

State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,
我们就要联想到是否可以采取State模式了.(节选自“板桥里人 http:
//www.jdon.com 2002/4/6/ 设计模式之State” 何时使用?)



//: state:StateDemo.java
import junit.framework.*;

interface State {
void operation1();
void operation2();
void operation3();
}

class ServiceProvider {
private State state;
public ServiceProvider(State state) {
this.state = state;
}
public void changeState(State newState) {
state = newState;
}
// Pass method calls to the implementation:
public void service1() {
state.operation1();
state.operation3();
}
public void service2() {
state.operation1();
state.operation2();
}
public void service3() {
state.operation3();
state.operation2();
}
}

class StateA implements State {
public void operation1() {
System.out.println(
"StateA.operation1()");
}
public void operation2() {
System.out.println(
"StateA.operation2()");
}
public void operation3() {
System.out.println(
"StateA.operation3()");
}
}

class StateB implements State {
public void operation1() {
System.out.println(
"StateB.operation1()");
}
public void operation2() {
System.out.println(
"StateB.operation2()");
}
public void operation3() {
System.out.println(
"StateB.operation3()");
}
}

public class StateDemo extends TestCase {
static void run(ServiceProvider sp) {
sp.service1();
sp.service2();
sp.service3();
}
ServiceProvider sp =
new ServiceProvider(new StateA());
public void test() {
run(sp);
// change state .we can change implemention.
sp.changeState(new StateB());
run(sp);
}
public static void main(String args[]) {
junit.textui.TestRunner.run(StateDemo.class);
}
}
///:~


Object decoupling的解释。

退耦:指消除或减轻两个以上物体间在某方面相互影响的方法
Proxy模式最大的用途很显然被用来控制访问“被代理者类”对象的实现。这两种模式很像,因为Proxy模式是一种特殊的State模式,即只有
一种State。
他们的相同之处是:他们都由“代理者类”控制“被代理者类”。
Proxy模式和State模式不同在于State模式有多个实现,而proxy模式只有
一个。Proxy模式被用来控制访问它的实现,State模式允许你动态的改变实现。

zqs1031



发表文章: 3
注册时间: 2010年01月09日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
State模式探讨(笔记心得体会) 2010年01月09日 15:55 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
请问一下state模式中所涉及的状态是否为内存中的状态而不是数据库中存储的状态?
banq



发表文章: 11308
注册时间: 2002年08月03日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 72人关注
回复:State模式探讨(笔记心得体会) 2010年01月09日 19:55 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
2010年01月09日 15:55 "zqs1031"的言论
状态是否为内存中的状态而不是数据库中存储的状态


在对象设计世界中,是看不到数据库的,是没有数据库概念的。所以,内存中状态或数据库存储的状态其实就是同一个状态,就象你在单位活动工作,然后到床上睡觉冬眠一样,不能说这两个不同形式就是不同的人了。
zqs1031



发表文章: 3
注册时间: 2010年01月09日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
State模式探讨(笔记心得体会) 2010年01月11日 14:08 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
谢谢板桥
maying112



发表文章: 5
注册时间: 2010年01月17日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
State模式探讨(笔记心得体会) 2010年01月17日 19:51 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
不知道LZ想讨论什么?
你这里的代码紧紧表现了接口的多态意义,而没有体现状态模式。

我觉得状态模式耦合度很大。因为要暴露所有状态子类。
banq



发表文章: 11308
注册时间: 2002年08月03日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 72人关注
回复:State模式探讨(笔记心得体会) 2010年01月18日 10:48 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
2010年01月17日 19:51 "maying112"的言论
状态模式耦合度很大。因为要暴露所有状态子类


状态模式封装的就是状态,不能暴露状态,应该暴露事件。
[该贴被banq于2010-01-18 10:48修改过]
标签     
共有 5 回复(1页) Go
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表    返回页首返回页首
???en_US.forumThreadNext.name??? 下一主题
正在读取,请等待...
查询本论坛内 回复超过的热门帖子
标题
 
粗体: [b]文本[/b] 斜体: [i]文本[/i] 下划线 [u]文本[/u] 插入网上的图片 [img]http://wwww.xxxx.com/img.ext[/img] 插入代码 [code]程序代码[/code]  插入url链接 [url]http://url[/url] / [url=http://url]URL加下滑线[/url] 上传图片 word文档 Txt等附件
内容
  提交时自动拷贝以上内容到剪贴板 Ctrl+V可取出;提问题前先查询标签列表

使用帮助 手机m.jdon.com RSS add to google add to yahoo
解惑之道在J道 ,打造中国最具影响力的的软件架构社区 推荐FireFox或Chrome快速浏览本站
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-10 jdon.com

anti spam