Java之美[从菜鸟到高手演变]之设计模式四

在阅读过程中有任何问题,请及时联系:egg。邮箱:xtfggef@gmail.com 微博:转载请说明出处:

其实每个设计模式都是很重要的一种思想,看上去很熟,其实是因为我们在学到的东西中都有涉及,尽管有时我们并不知道,其实在Java本身的设计之中处处都有体现,像AWT、JDBC、集合类、IO管道或者是Web框架,里面设计模式无处不在。因为我们篇幅有限,很难讲每一个设计模式都讲的很详细,不过我会尽我所能,尽量在有限的空间和篇幅内,把意思写清楚了,更好让大家明白。本章不出意外的话,应该是设计模式最后一讲了,,首先还是上一下上篇开头的那个图:

本章讲讲第三类和第四类。

19、备忘录模式(Memento)

主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些,通俗的讲下:假设有原始类A,A中有各种属性,A可以决定需要备份的属性,备忘录类B是用来存储A的一些内部状态,类C呢,就是一个用来存储备忘录的,且只能存储,不能修改等操作。做个图来分析一下:

Original类是原始类,里面有需要保存的属性value及创建一个备忘录类,用来保存value值。Memento类是备忘录类,Storage类是存储备忘录的类,持有Memento类的实例,该模式很好理解。直接看源码:

public class Original {private String value;public String getValue() {return value;}public void setValue(String value) {this.value = value;}public Original(String value) {this.value = value;}public Memento createMemento(){return new Memento(value);}public void restoreMemento(Memento memento){this.value = memento.getValue();}}public class Memento {private String value;public Memento(String value) {this.value = value;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}}public class Storage {private Memento memento;public Storage(Memento memento) {this.memento = memento;}public Memento getMemento() {return memento;}public void setMemento(Memento memento) {this.memento = memento;}}

测试类:

public class Test {public static void main(String[] args) {// 创建原始类Original origi = new Original("egg");// 创建备忘录Storage storage = new Storage(origi.createMemento());// 修改原始类的状态System.out.println("初始化状态为:" + origi.getValue());origi.setValue("niu");System.out.println("修改后的状态为:" + origi.getValue());// 回复原始类的状态origi.restoreMemento(storage.getMemento());System.out.println("恢复后的状态为:" + origi.getValue());}}

输出:

初始化状态为:egg修改后的状态为:niu恢复后的状态为:egg

简单描述下:新建原始类时,value被初始化为egg,后经过修改,将value的值置为niu,最后倒数第二行进行恢复状态,结果成功恢复了。其实我觉得这个模式叫“备份-恢复”模式最形象。

20、状态模式(State)

核心思想就是:当对象的状态改变时,同时改变其行为,很好理解!就拿QQ来说,有几种状态,在线、隐身、忙碌等,每个状态对应不同的操作,而且你的好友也能看到你的状态,所以,状态模式就两点:1、可以通过改变状态来获得不同的行为。2、你的好友能同时看到你的变化。看图:

State类是个状态类,Context类可以实现切换,我们来看看代码:

package com.xtfggef.dp.state;/** * 状态类的核心类 * 2012-12-1 * @author erqing * */public class State {private String value;public String getValue() {return value;}public void setValue(String value) {this.value = value;}public void method1(){System.out.println("execute the first opt!");}public void method2(){System.out.println("execute the second opt!");}}package com.xtfggef.dp.state;/** * 状态模式的切换类 2012-12-1 * @author erqing * */public class Context {private State state;public Context(State state) {this.state = state;}public State getState() {return state;}public void setState(State state) {this.state = state;}public void method() {if (state.getValue().equals("state1")) {state.method1();} else if (state.getValue().equals("state2")) {state.method2();}}}测试类:public class Test {public static void main(String[] args) {State state = new State();Context context = new Context(state);//设置第一种状态state.setValue("state1");context.method();//设置第二种状态state.setValue("state2");context.method();}}输出:

execute the first opt!execute the second opt!

根据这个特性,状态模式在日常开发中用的挺多的,尤其是做网站的时候,我们有时希望根据对象的某一属性,区别开他们的一些功能,比如说简单的权限控制等。21、访问者模式(Visitor)

访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。若系统数据结构对象易于变化,经常有新的数据对象增加进来,则不适合使用访问者模式。访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者。访问者模式将有关行为集中到一个访问者对象中,其改变不影响系统数据结构。其缺点就是增加新的数据结构很困难。—— From 百科

简单来说,访问者模式就是一种分离对象数据结构与行为的方法,通过这种分离,可达到为一个被访问者动态添加新的操作而无需做其它的修改的效果。简单关系图:

,再回头,便生出无限羁绊。那是彼此的刺在对方心里留下的痕迹,

Java之美[从菜鸟到高手演变]之设计模式四

相关文章:

你感兴趣的文章:

标签云: