现在的位置: 首页 > 综合 > 正文

设计模式-结构型模式-备忘录

2017年12月08日 ⁄ 综合 ⁄ 共 2567字 ⁄ 字号 评论关闭

行为模式涉及到算法和对象间职责的分配。
MEMENTO:在不破坏封装性的前提条下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以恢复这个对象以前的状态。

 

package behaviour.memento;
/**
 *  A Caretaker as our test client
 */
import java.io.*;

public class CaretakerTest  {
    public static void main(String[] args) {
        TextOriginator originator = new TextOriginator();
        System.out.println("-----  Please edit text  -----");
        System.out.println("Usage: input /"undo/" to undo your edit");
        System.out.println("Usage: input /"end/" to end edit");
        try {
            BufferedReader in = new BufferedReader(
                new InputStreamReader(System.in));           

            String str = "";
            while(true) {
                str = in.readLine();
                if(str.equals("end")) {
                    System.out.println("-----  End edit  -----");
                    break;
                } else if(str.equals("undo")) {
                    originator.setMemento();
                } else {
                    if(! str.equals("")) {
                        originator.addText(str);
                        originator.createMemento();
                    }
                   
                }
                System.out.println("--Input Text is :" + originator.getText());
            }
        } catch(IOException e) {
            System.out.println("I/O Error !");
            System.exit(1);
        }
    }
}

 

package behaviour.memento;
/**
 *  Our test Originator class with Memento class.
 *  Put 2 class into 1 file, so Memento member can be  visited by Originator
 */
import java.io.*;
import java.util.*;

public class TextOriginator  {
    private StringBuffer strbuf = new StringBuffer();
    private String state = "";
    private TextMemento memo;
    public TextOriginator() {
        memo = new TextMemento();
    }
    public void addText(String addStr) {
        state = addStr;
        strbuf.append(addStr);
    }
    public void createMemento() {
        memo.addMemo(state);
    }
    public void setMemento() {
        String tmp = memo.getState();
        if(tmp != null) {           
            int start = strbuf.length() - tmp.length();
            int end = strbuf.length();
            if(start >= 0) {
                strbuf.delete(start,  end);
            } else {
                System.out.println("Get Memo Error !");
            }
        }
    }
    public String getText() {
        return strbuf.toString();
    }
}

class TextMemento {
    //String state;
    int i = 0;
    LinkedList memoList;
   
    TextMemento() {
        //state = null;
        memoList = new LinkedList();
    }
    void addMemo(String state) {
        memoList.addLast(state);
    }
    String getState() {
        if(memoList.size() != 0) {
            String tmp = (String)memoList.getLast();
            memoList.removeLast();
            return tmp;
        } else {
            return null;
        }     
    }
}

抱歉!评论已关闭.