Memento模式與Prototype模式結合
我是菜鳥,剛開始學習設計模式,參考jdon的設計模式這本書,裡面關於 Memento模式的例子如下(本人稍加修改)
[@more@]我在另一個網站上的文章:我是菜鳥,剛開始學習設計模式,參考jdon的設計模式這本書,裡面關於 Memento模式的例子如下(本人稍加修改):
1. 原始資料類
public class Originator {
protected int number = 0;
protected String file = null;
public Originator() {
}
public void setNumber(int number){
this.number = number;
}
public int getNumber(){
return number;
}
public void setFile(String file){
this.file = file;
}
public String getFile(){
return file;
}
// 建立一個Memento
public Memento getMemento() {
return new Memento(this);
}
// 恢復到原始值
public void setMemento(Memento m) {
number = m.number;
file = m.file;
}
}
2.儲存類
public class Memento {
protected int number;
protected String file = null;
public Memento(Originator o) {
number = o.number;
file = o.file;
}
}
3.測試應用:
public void testMemento(){
Originator org = new Originator();
org.setNumber(10);
org.setFile("org_File");
Memento mem = new Memento(org);
org.setFile("new_File");
org.setNumber(20);
org.setMemento(mem);
assertEquals(org.getFile(),"org_File");
assertEquals(org.getNumber(),10);
}
測試ok! 可以恢復原來的值。頁面應用中的session,還有資料層的持久層 感覺也用了這種方法。
缺點:如果資料量很大時,不僅寫備份類不方便,而且也很耗費大,如果內部狀態很多,再儲存一份,無意要浪費大量記憶體.
想到以前學過的 Prototype 模式,結合如下:
1.原始類
public class Originator implements Cloneable {
protected int number = 0;
protected String file = null;
protected Originator org = null;//用於儲存的類
public Originator() {
}
public void setNumber(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
public void setFile(String file) {
this.file = file;
}
public String getFile() {
return file;
}
//取出原始值
public Originator getOriginator() {
return org;
}
//恢復到原始值
public void setOriginator() {
org =(Originator)this.clone();
}
//prototype 方法
public Object clone() {
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException exception) {
System.err.println("Originator is not Cloneable");
}
return object;
}
}
2.測試類如下:
public void testPrototype(){
Originator org = new Originator();
org.setNumber(10);
org.setFile("org_File");
//Memento mem = new Memento(org);
org.setOriginator();//將原資料放入儲存類中
org.setFile("new_File");
org.setNumber(20);
///org.setMemento(mem);
org.getOriginator();//得到原來值
///org.setMemento(mem);
assertEquals(org.getOriginator().getFile(),"org_File");
assertEquals(org.getOriginator().getNumber(),10);
}
結果一樣,這裡簡單了類的編寫,不過可能 還是要浪費記憶體。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9879276/viewspace-983063/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java備忘錄模式(Memento模式)Java模式
- Scala 與設計模式(三):Prototype 原型模式設計模式原型
- 設計模式 - 備忘錄模式 ( Memento )設計模式
- 備忘錄模式(Memento)模式
- 深入探索Factory模式與Prototype模式的異同 (轉)模式
- java設計模式-備忘錄模式(Memento)Java設計模式
- 設計模式-原型模式(Prototype)設計模式原型
- 原型模式(Prototype)原型模式
- 請教prototype模式!模式
- 設計模式--原型模式(Prototype Pattern)設計模式原型
- 設計模式之-原型模式-Prototype設計模式原型
- C#設計模式系列:備忘錄模式(Memento)C#設計模式
- 設計模式--備忘錄模式Memento(行為型)設計模式
- JAVA設計模式之 備忘錄模式【Memento Pattern】Java設計模式
- 原型模式(Prototype Pattern)。原型模式
- 設計模式之Prototype設計模式
- Rust語言之GoF設計模式:備忘錄Memento模式RustGo設計模式
- 設計模式的征途—20.備忘錄(Memento)模式設計模式
- 《設計模式 》 - 4. 原型模式( Prototype )設計模式原型
- 設計模式--原型模式Prototype(建立型)設計模式原型
- 談談設計模式~原型模式(Prototype)設計模式原型
- 組合模式(Composite)的安全模式與透明模式模式
- 談 C++17 裡的 Memento 模式C++模式
- C#設計模式-原型模式(Prototype Pattern)C#設計模式原型
- 設計模式的征途—5.原型(Prototype)模式設計模式原型
- C#設計模式系列:原型模式(Prototype)C#設計模式原型
- JAVA設計模式之 原型模式【Prototype Pattern】Java設計模式原型
- 建立模式 02-Prototype(原型)模式原型
- 設計模式-原型模式(Prototype)【重點:淺複製與深複製】設計模式原型
- 設計模式(十四、十五)----結構型模式之組合模式設計模式
- Net設計模式例項之備忘錄模式(Memento Pattern)(2)設計模式
- 結構型-組合模式模式
- Go程式設計模式三—Fan-Out模式與協程池結合Go程式設計設計模式
- 請教:模式與模式的複合產物!模式
- 狀態機模式 與 ajax 的結合運用模式
- 設計模式--組合模式Composite(結構型)設計模式
- 3.4 PROTOTYPE(原型) — 物件建立型模式原型物件模式
- 結合案例深入解析策略模式模式