Java设计模式Memento探讨
众所周知: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中的实现了.
推荐文章 |
