网站首页 新闻首页 网页设计图形动画软件编程网站开发办公软件操作系统数据库网络技术认证考试范文资料黑客攻防 书籍教程 进入论坛

Java设计模式Memento探讨

http://www.diybl.com/ 2008-3-11  网络 点击:  [ 评论 ]
文章搜索:    【点击打包该文章】

众所周知:GOF设计模式中的memento模式,是用C++给出实例,和类UML图的,但是从java语言本身来说,要解决memento模式,又要不违背memento设计模式的 中的各个约束,是否存在一些困难。

本文将重各个角度来进行剖析:

1)有人说:使用Clone模式:

    Clone就是把对象复制成另一个同类型的对象,这样一来该对象的接口,也就全面复制,但是这样破坏了封装性,外部程序能力调用该对象所在的类接口函数,来修改该保存对象的状态。

2)有人说:对象序列化

  对象序列化,将对象的状态保存到文件或别对象中,然后反序列化进行恢复,依然和对象clone一样,依然可以通过该对象的接口函数,对对象的状态进行修改。

3)有人说:使用java包的默认访问方式,该包只有所谓的Orginator已经Memento对象,但是别的依然可以引用,修改该对象。

4)看我怎么说怎么做:

  采用java中的内部类,以及接口来实现。

Memento模式蜕变过程:

package com.caoxiao.pattern.memento;

public class Originator {
 private State state;
 public Originator() {
  state = new State();
 }
 public void setMemento(AbstractMemento memento) {
  if(memento instanceof Memento) {
   this.state = ((Memento)memento).state;
  }else{
   throw new ClassCastException("AbstractMemento can''t implemnts by yourself.");
  }
 }
 public Memento createMemento() {
  return new Memento(state);
 }
 
 class Memento {
  private State state;
  public Memento(State state) {
   this.state = state;
  }
 }
}

以上代码可以遵守宽窄接口的定义,对(Client)客户代码窄接口,对(Originator)要保存对象状态的那个类来说却是宽接口,但是这样使的Memento 类在Originator 类外,无法正常访问。

因此改造如下:将Memento抽象化:

package com.caoxiao.pattern.memento;

public class Originator {
 private State state;
 public Originator() {
  state = new State();
 }
 public void setMemento(AbstractMemento memento) {
  if(memento instanceof Memento) {
   this.state = ((Memento)memento).state;
  }else{
   throw new ClassCastException("AbstractMemento can''t implemnts by yourself.");
  }
 }
 public AbstractMemento createMemento() {
  return new Memento(state);
 }
 
 class Memento implements AbstractMemento{//Memento''s abstract interface
  private State state;
  public Memento(State state) {
   this.state = state;
  }
 }
}

//以下是Originator类的内部要保存状态的类

package com.caoxiao.pattern.memento;

public class State {
 public State() {
  System.out.println("Hello originator state...");
 }
 public String toString() {
  return "originator state...";
 }
}

//Memento的空抽象接口,不提供任何访问。。

package com.caoxiao.pattern.memento;

public interface AbstractMemento {
}

//以下是客户驱动代码:

package com.caoxiao.pattern.client;

import com.caoxiao.pattern.memento.AbstractMemento;
import com.caoxiao.pattern.memento.Originator;

public class Client {
 public  static void main(String []args) {
  Originator originator = new Originator();
  AbstractMemento memento =originator.createMemento();
  originator.setMemento(memento);
 }
}

//这样就比较完美的解决了Memento模式在java中的实现了.

 

 

 

 

 

 



文章整理:DIY部落 http://www.diybl.com (本站)   【点击打包该文章】
如果图片或页面不能正常显示请点击这里 站内搜索:   

文章评论

请您留言

 

最新新闻