- 浏览: 1332691 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (471)
- 原创文章 (4)
- Database (84)
- J2SE (63)
- Web (26)
- Javascript (30)
- Lucene (11)
- os (13)
- 算法 (8)
- Webservice (1)
- Open projects (18)
- Hibernate (18)
- Spring (15)
- Css (2)
- J2ee (2)
- 综合技术 (18)
- 安全管理 (13)
- PatternsInJava (27)
- NIO (5)
- Ibatis (2)
- 书籍收藏 (1)
- quartz (7)
- 并发编程 (15)
- oracle问题 (2)
- ios (60)
- coco2d-iphone (3)
- C++ (6)
- Zookeeper (2)
- golang (4)
- animation (2)
- android (1)
最新评论
-
dandingge123:
【引用】限制UITextField输入长度的方法 -
qja:
...
对List顺序,逆序,随机排列实例代码 -
安静听歌:
现在在搞这个,,,,,哎~头都大了,,,又freemarker ...
通用大型网站页面静态化解决方案(一) -
springdata-jpa:
java quartz定时任务demo教程源代码下载,地址:h ...
Quartz 配置参考 -
马清天:
[b][/b][list][*]引用[u][/u][/list ...
通用大型网站页面静态化解决方案(一)
如果您不了解TCP的连线方式,在看 Gof 的书介绍State模式时,大概会看得一头雾水吧!TCP的连线状态图,光是要了解就要花点精神了,它的连线状态很多,用来说明状态模式确实很适合,但不适合教导初学模式的人。
由简单的开始会比较好理解状态模式的作用,先来看一个例子,如果您有一个只能顺时针转动的瓦斯开关,转动一次的状态为off、 small fire、medium fire与large fire,您如何在程式中控制状态的变化与行为呢?一个最简单的方式就是用if..else或是switch流程来控制,例如:
- State.java
public class State { private int state; public State() { state = 0; } public void switchFire() { if (state == 0) { state = 1; System.out.println( "small fire" ); } else if (state == 1) { state = 2; System.out.println( "medium fire" ); } else if (state == 2) { state = 3; System.out.println( "large fire" ); } else { state = 0; System.out.println( "turning off" ); } } }
- Main.java
public class Main { public static void main(String[] args) { State state = new State(); state.switchFire(); state.switchFire(); state.switchFire(); state.switchFire(); } }
这个方法很简单,每个人都会,但如果您的状态变化并不是流水式的变化,而是像TCP连线状态一样,会是一个网络图的时候,用 if...else或switch来写的话,您的程式就会乱的不像话了;来考虑如何让物件控制自己的状态转换与所应表现的行为,这个程式可以这样改写:
- IState.java
public interface IState { public void switchFire(FireSwitch sw); }
- OffState
public class OffState implements IState { public void switchFire(FireSwitch sw) { sw.setState(new SmallState()); System.out.println( "small fire" ); } }
- SmallState.java
public class SmallState implements IState { public void switchFire(FireSwitch sw) { sw.setState(new MediumState()); System.out.println( "medium fire" ); } }
- MediumState.java
public class MediumState implements IState { public void switchFire(FireSwitch sw) { sw.setState(new LargeState()); System.out.println( "large fire" ); } }
- LargeState.java
public class LargeState implements IState { public void switchFire(FireSwitch sw) { sw.setState(new OffState()); System.out.println( "off fire" ); } }
- FireSwitch.java
public class FireSwitch { private State current; public FireSwitch() { current = new OffState(); } public void setState(State s) { current = s; } public void switchFire() { current.switchFire(this); } }
- Main.java
public class Main { public static void main(String[] args) { FireSwitch fireSwitch = new FireSwitch(); fireSwitch.switchFire(); fireSwitch.switchFire(); fireSwitch.switchFire(); fireSwitch.switchFire(); } }
程式执行结果与上一个例子是一样的,但这次并没有用流程控制来进行状态转换,而由物件自行控制自己的状态,与必须表现的行为,这个方式就是State 模式,将这个例子的 UML 类别结构画出就如下所示:
再进一步考虑开关可以顺时针与逆时针转动,这时如果您仍以if...else或switch来写,就会让流程显示复杂,来看看如何使用状态模式来撰写:
- IState.java
public interface IState { public void switchClockWise(FireSwitch sw); public void switchCountClock(FireSwitch sw); }
- OffState.java
public class OffState implements IState { public void switchClockWise(FireSwitch sw) { sw.setState(new SmallState()); System.out.println("small fire"); } public void switchCountClock(FireSwitch sw) { sw.setState(new LargeState()); System.out.println("large fire"); } }
- SmallState.java
public class SmallState implements IState { public void switchClockWise(FireSwitch sw) { sw.setState(new MediumState()); System.out.println("medium fire"); } public void switchCountClock(FireSwitch sw) { sw.setState(new OffState()); System.out.println("off fire"); } }
- MediumState.java
public class MediumState implements IState { public void switchClockWise(FireSwitch sw) { sw.setState(new LargeState()); System.out.println("large fire"); } public void switchCountClock(FireSwitch sw) { sw.setState(new SmallState()); System.out.println("small fire"); } }
- LargeState.java
public class LargeState implements State { public void switchClockWise(FireSwitch sw) { sw.setState(new OffState()); System.out.println("off fire"); } public void switchCountClock(FireSwitch sw) { sw.setState(new MediumState()); System.out.println("medium fire"); } }
- FireSwitch.java
public class FireSwitch { private State current; public FireSwitch() { current = new OffState(); } public void setState(State s) { current = s; } public void switchClockWise() { current.switchClockWise(this); } public void switchCountClock() { current.switchCountClock(this); } }
- Main.java
public class Main { public static void main(String[] args) { FireSwitch fireSwitch = new FireSwitch(); fireSwitch.switchClockWise(); fireSwitch.switchClockWise(); fireSwitch.switchClockWise(); fireSwitch.switchClockWise(); System.out.println(); fireSwitch.switchCountClock(); fireSwitch.switchCountClock(); fireSwitch.switchCountClock(); fireSwitch.switchCountClock(); } }
接下来您可以任意的转动开关了,无论是顺时针转动或是逆时针转动,状态的转换都由物件自己来表现,这是双向状态转换下的例子,如果一个状态可能转换至三个以上的状态,使用State模式就更可以看出它的好处了,就像Gof的TCP连线例子一样,如果您了解TCP连线,可以看看原书是如何实现TCP连线之间的状态转换的。
发表评论
-
Java 事件传送技术
2010-12-20 14:16 1479developerWorks 中国 ... -
Design Pattern: Mediator 模式
2010-11-13 23:31 1235Mediator的意思是中介者、调节者、传递物,顾名思义,这个 ... -
Design Pattern: Command 模式
2010-11-13 23:30 1093如果您写过Java的Swing视窗程式,您可能使用过Comma ... -
Design Pattern: Strategy 模式
2010-11-13 23:25 1283考虑您要设计一个更换各种符号的工具类TextCharChang ... -
Design Pattern: Read-Write-Lock 模式
2010-11-10 23:58 1171如果有一个资料档有可能同时间会有许多客户端对它进行读取与写入的 ... -
Design Pattern: Producer Consumer 模式
2010-11-10 23:52 1304Producer Consumer模式与 Guar ... -
Design Pattern: Guarded Suspension 模式
2010-11-10 23:48 1125考虑这么一个伺服器,它可以处理来自多个客户端的服务请求(Req ... -
Design Pattern: Observer 模式
2010-11-10 23:33 1029Java深入到一定程度,就不可避免的碰到设计模式(design ... -
Design Pattern: Iterator 模式
2010-11-10 23:22 1080这个模式已经被整合入Java的Collection.在大多数场 ... -
Design Pattern: Interpreter 模式
2010-11-10 23:17 1259对于一个具有层次节点关系的问题来说,如果您要剖析每一个节点,您 ... -
Design Pattern: Command 模式
2010-11-10 23:08 1338Command定义n 将来自客户端的请求传入一个对象,无需了解 ... -
Design Pattern: Chain of Responsibility 模式
2010-11-10 23:00 1251其实Chain of Responsibility ... -
Design Pattern: Proxy 模式
2010-11-10 22:51 1586来看看实现代理的两种方式:Static Proxy与Dynam ... -
Design Pattern: Flyweight 模式
2010-11-10 22:48 1390Flyweight(享元)模式定义:避免大量拥有相同内容的小类 ... -
Design Pattern: Facade 模式
2010-11-10 22:42 1294Facade模式的定义: 为子系统中的一组接口提供一个一致的界 ... -
Design Pattern: Decorator 模式
2010-11-10 22:35 1334装饰模式:Decorator常被翻译成"装饰&quo ... -
Design Pattern: Bridge 模式
2010-11-10 22:24 1142Bridge模式定义 :将抽象 ... -
Design Pattern: Default Adapter 模式(二)
2010-11-10 22:16 1518适配器模式定义:将两个 ... -
Design Pattern: Default Adapter 模式
2010-11-10 22:07 1109在Java中如果要定义事件 ... -
Design Pattern: Singleton 模式
2010-11-10 22:06 1036Singleton的英文意义是独身,也就是只有一个人,应用在物 ...
相关推荐
本资源“DesignPattern::pencil:设计模式_java实现以及详解”提供了一套详细的学习材料,帮助开发者理解和应用设计模式。 该资源的作者是“养码青年-Style”,他通过这个项目记录了自己的设计模式学习过程。鼓励...
DesignPattern-master这个压缩包可能包含了一个关于设计模式的项目或者教程资源。 设计模式分为三类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和行为型模式(Behavioral Patterns)...
"designPattern:设计模式相关代码实现"这个项目,显然提供了不同设计模式在Java语言中的实际应用示例。 在Java世界里,设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。每种模式都针对特定的编程问题...
本资源"DesignPattern:设计模式.net源代码"提供了一套基于.NET实现的设计模式示例,旨在帮助程序员更好地理解和应用这些模式。 在"DesignPattern-master"这个压缩包中,你可能找到的文件结构和内容包括: 1. **...
23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) 生成...
这个名为"DesignPattern"的压缩包文件很可能包含了一个Java实现的各种设计模式的示例程序。 在这个"DesignPattern-master"目录中,我们可以期待找到一系列与设计模式相关的Java源代码文件(.java),每个文件或...
"DesignPattern:C#设计模式示例"这个资源很可能是包含多个C#实现的设计模式示例代码库。 设计模式通常分为三类:创建型、结构型和行为型。每种模式都解决了特定场景下的问题,并提供了良好的代码组织和扩展性。 ...
在给定的“com.designpattern.state_observer.rar”压缩包中,我们可以期待找到有关“状态模式(State Pattern)”和“观察者模式(Observer Pattern)”的示例代码或教程。这两种模式都是行为设计模式,它们在处理...
设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的经验总结。...在DesignPattern-master这个压缩包中,你可以找到关于这些模式的详细讲解和实例代码,为你的Java开发之旅提供宝贵的参考资料。
这个名为"Design-pattern:设计模式"的压缩包可能包含了一个关于设计模式的学习资源,比如代码示例或者教程。 创建型设计模式是设计模式中的一个类别,主要关注对象的创建过程。这类模式包括工厂方法(Factory ...
本资料包“JAVA 23种设计模式(全).Design Pattern_Java模式”涵盖了所有23种经典的GOF(GoF,Gang of Four)设计模式,旨在帮助开发者深入理解和应用这些模式。 首先,我们来看一下23种设计模式的分类: 1. **创建...
### Design Pattern(设计模式)讲义 #### 一、引言 设计模式是软件工程领域的一个重要主题,它提供了一套解决常见问题的方案。侯捷老师的讲义为我们揭示了设计模式背后的原理与实践方法。这份讲义不仅包含了GoF...
本教程的"designpattern-master"可能包含以上各种设计模式的实例代码和详细解释,帮助学习者通过实践掌握这些模式。在实际项目中,灵活运用这些设计模式可以提高代码质量,使项目更加健壮和易于维护。对于PHP开发者...
设计模式(Design Pattern)是软件工程中用于解决软件设计问题的既定方案。设计模式并非直接的代码实现,而是一套被验证过的通用解决方案模板。它们是由经验丰富的软件开发者总结出的,在特定上下文中对常见问题的...
设计模式(Design Pattern)是软件工程中的一种经验总结,它是在特定上下文中为解决常见问题而提出的一套可复用的解决方案。设计模式并不直接实现为代码,而是提供了一种在面向对象设计中如何处理常见问题的指南。...
本资料库中的"design pattern设计模式范例"提供了23种经典设计模式以及最新的范式用法,非常适合用于项目重构或作为学习设计模式的参考。 首先,我们来看23种经典的设计模式,它们通常分为三类:创建型、结构型和...
"design-pattern:设计模式学习"这个主题涵盖了许多关键知识点,包括但不限于以下几个方面: 1. **单例模式(Singleton)**:保证一个类只有一个实例,并提供全局访问点。在Java中,可以通过双重检查锁定、静态内部...
DesignPattern Android源码设计模式解析与实战读书笔记源代码 说明: 包名factorypattern.normal表示的是工厂方法模式的普通用法 包名factorypattern.practices表示的是工厂方法模式的常用 包名observerpattern表示...