关于JAVA中状态设计模式的讲解示例代码

为了使同一个方法调用可以产生不同的行为,State 模式在代理(surrogate)的生命周期内切换它所对应的实现(implementation)。当你发现,在决定如何实现任何一个方法之前都必须作很多测试的情况下,这是一种优化实现代码的方法。     --
    对象去耦(Object decoupling)

例如:童话故事青蛙王子就包含一个对象(一个生物),这个对象的行为取决于它自己所处 的状态。你可以用一个布尔(boolean)值来表示它的状态,测试程序如下:

状态模式:改变对象的行为, 一个用来改变类的(状态的)对象。

迹象:几乎所有方法里都出现(相同的)条件(表达式)代码。但是,greet() 方法(以及其它所有在完成操作之前必须测试 isFrog 值的那些方法)最终要产生一大堆难以处理的代码。   如果把这些操作都委托给一个可以改变的状 态对象(State object),那代码会简单很多。

下面的代码演示了 State 模式的基本结构:

在 main( )函数里,先用到的是第一个实现,然后转入第二个实现。 当你自己实现 State 模式的时候就会碰到很多细节的问题,你必须根据自己的需要选择合适的实现方法,比如用到的状态(State)是否要暴露给调用的客户,以及如 何使状态发生变化。有些情况下(比如 Swing 的LayoutManager),客户端可以直接传对象进来,但是在KissingPrincess2.java
那个例子里,状态对于客户端来说是不可见的。

此外,用于改变状态的机制可能很简单也可能很复杂-比如状态机制(State Machine),那里会讲到一系列的状态以及改变状态的不同机制。 上面提到 Swing 的 LayoutManager 那个例子非常有趣,它同时体现了Strategy 模 式和 State 模式的行为。Proxy 模式和 State 模式的区别在于它们所解决的问题不同。《设计模式》里是这 么描述的。

Proxy 模式的一般应用的:

1> 远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代理。 RMI 编译器(rmic)在创建 stubs 和 skeletons 的时候会自动为你创建一 个远端代理。

2> 虚代理(Virtual proxy),根据需要,在创建复杂对象时使用“延迟初 始化(lazy initialization)” 。

3> 保护代理(protection proxy) 用于你不希望客户端程序员完全控制被代理对象(proxied object)的情况下。

4> 智能引用(smart reference). 当访问被代理对象时提供额外的动作。

例如:

它可以用来对特定对象的引用进行计数,从而实现写时复制 (copy-on-write),进而避免对象别名(object aliasing)。 更简单的一个例子是用来记录一个特定方法被调用的次数。 你可以把 java 里的引用(reference)看作是一种保护代理,它控制对分配在堆(heap)上的实际对象的访问(而且可以保证你不会用到一个空引用(null reference))。 『重写:在《设计模式》一书里,Proxy 模式和State 模式被认为是互不相干的, 因为那本书给出的用以实现这两种模式的结构是完全不同的(我认为这种实现有点武 断)。尤其是 State模式,它用了一个分离的实现层次结构,但我觉着完全没有必 要,除非你认定实现代码不是由你来控制的(当然这也是一种可能的情况,但是如果代码是由你来控制的,那还是用一个单独的基类更简洁实用)。此外,Proxy 模式的实现不需要用一个公共的基类,因为代理对象只是控制对被代理对象的访问。尽管有细 节上的差异,Proxy 模式和 State模式都是用一个代理(surrogate)把方法调用传递 给实现对象。』

时间: 2024-10-04 11:29:54

关于JAVA中状态设计模式的讲解示例代码的相关文章

Java中单态设计模式

Java中单态设计模式 2011-09-23 16:38:46|  分类: Java |  标签:technology!  |举报|字号 订阅 此博文是转自新浪博客中一名叫做"俊俊的BLOG“用户的一篇博文.感觉此博文确实很不错,所以在此拿出来分享一下!(笔者只是对其所举的代码略做了一些修改) 一概念: 设计模式:设计模式是指经过大量的实践总结和理论化之后的优选的代码结构.编程风格.以及解决问题的思路. 单态设计模式:采取一定的方法保证在整个软件系统中,对某个类只能产生一个对象实例,并且该类只提

java 重新抛出异常 相关处理结果示例代码

package org.rui.ExceptionTest; /** * 重新抛出异常 * 在某些情况下,我们想重新掷出刚才产生过的违例,特别是在用Exception 捕获所有可能的违例时.由于我 们已拥有当前违例的句柄,所以只需简单地重新掷出那个句柄即可.下面是一个例子: catch(Exception e) { System.out.println("一个违例已经产生"); throw e; } 重新"掷"出一个违例导致违例进入更高一级环境的违例控制器中.用于同

java泛型边界深入探讨,示例代码

package org.rui.generics.bounds; import java.awt.Color; /** * 边界 * 下面展示了边界基本要素. * @author lenovo * */ interface HasColor{java.awt.Color getColor();} class Colored<T extends HasColor> { T item; Colored(T item){this.item=item;} T getItem(){return item

Java中this和static关键字及代码块

this: 可以使用this表示类中的属性------this.name=name 可以使用this强调调用的是本类的方法 可以使用this调用本类的构造方法------this();调用本类中无参构造方法 可以使用this表示当前对象(调用方法的对象)----最重要的用途 static: 声明属性---------属性则为全局变量 声明方法---------Person.setName("Tom");使用类名称调用static方法 普通代码块:直接在方法或是语句中定义的代码块 pub

Java中替换HTML标签的方法代码

这篇文章主要介绍了Java中替换HTML标签的方法代码,需要的朋友可以参考下 replaceAll("\\&[a-zA-Z]{0,9};", "").replaceAll("<[^>]*>", "\n\t") 源码如下: /** * 字符串替换 */ package com.you.model; /** * HTML标签替换 * @author YHD * @version */ public cla

Java中的设计模式(七):观察者模式

介绍 观察者模式是行为设计模式之一.当您对对象的状态感兴趣并希望在有任何更改时收到通知时,观察者设计模式非常有用.在观察者模式中,监视另一个对象状态的对象称为Observer,正在被监视的对象称为Subject. 根据GoF,观察者设计模式的意图是; 定义对象之间的一对多依赖关系,以便当一个对象更改状态时,将自动通知和更新其所有依赖项. Subject包含一个观察者列表,用于通知其状态的任何变化,因此它应该提供观察者可以注册和注销自己的方法.Subject还包含一种方法,用于通知所有观察者任何更

Java中的设计模式(八):建造者模式

介绍 今天我们将研究java中的Builder模式.Builder 设计模式是一种创造性的设计模式,如工厂模式和抽象工厂模式. 当Object包含许多属性时,引入了Builder模式来解决Factory和Abstract Factory设计模式的一些问题. 当Object包含许多属性时,Factory和Abstract Factory设计模式存在三个主要问题. 从客户端程序传递到Factory类的参数太多,可能容易出错,因为大多数情况下,参数的类型是相同的,而从客户端来说,很难维护参数的顺序.

Java中常见设计模式面试

一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种: 策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1.请列举出在JDK中几个常用的设计模式? 单例模式用于Runtime, Calendar和其他的一些类中.工厂模式被

JAVA中常用设计模式

设计模式:一个程序员对设计模式的理解:"不懂"为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精髓所在,我所理解的"简单"就是一把钥匙开一把锁的模式,目的仅仅是着眼于解决现在的问题,而设计模式的"复杂"就在于它是要构造一个"万能钥匙",目的是提出一种对所有锁的开锁方案.在真正理解设计模式之前我一直在编写"简单"的代码.这个&qu