溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Memento模式與Prototype模式結(jié)合

發(fā)布時(shí)間:2020-08-11 10:26:07 來源:ITPUB博客 閱讀:150 作者:biqing0427 欄目:編程語言

我是菜鳥,剛開始學(xué)習(xí)設(shè)計(jì)模式,參考jdon的設(shè)計(jì)模式這本書,里面關(guān)于 Memento模式的例子如下(本人稍加修改)

[@more@]我在另一個(gè)網(wǎng)站上的文章:
http://www.matrix.org.cn/thread.shtml?topicId=5c99e4e2-90d7-11dc-b8c0-a384f0e97a57&forumId=20

我是菜鳥,剛開始學(xué)習(xí)設(shè)計(jì)模式,參考jdon的設(shè)計(jì)模式這本書,里面關(guān)于 Memento模式的例子如下(本人稍加修改):

1. 原始數(shù)據(jù)類

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;
}

// 創(chuàng)建一個(gè)Memento
public Memento getMemento() {
return new Memento(this);
}

// 恢復(fù)到原始值
public void setMemento(Memento m) {
number = m.number;
file = m.file;
}
}

2.儲(chǔ)存類
public class Memento {

protected int number;
protected String file = null;

public Memento(Originator o) {
number = o.number;
file = o.file;
}
}

3.測試應(yīng)用:
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! 可以恢復(fù)原來的值。頁面應(yīng)用中的session,還有數(shù)據(jù)層的持久層 感覺也用了這種方法。
缺點(diǎn):如果數(shù)據(jù)量很大時(shí),不僅寫備份類不方便,而且也很耗費(fèi)大,如果內(nèi)部狀態(tài)很多,再保存一份,無意要浪費(fèi)大量內(nèi)存.

想到以前學(xué)過的 Prototype 模式,結(jié)合如下:

1.原始類
public class Originator implements Cloneable {

protected int number = 0;
protected String file = null;

protected Originator org = null;//用于存儲(chǔ)的類

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;
}

//恢復(fù)到原始值
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();//將原數(shù)據(jù)放入存儲(chǔ)類中

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);
}

結(jié)果一樣,這里簡單了類的編寫,不過可能 還是要浪費(fèi)內(nèi)存。
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI