1. 程式人生 > >撤銷功能的實現——備忘錄模式(三)

撤銷功能的實現——備忘錄模式(三)

21.3 完整解決方案

      為了實現撤銷功能,Sunny公司開發人員決定使用備忘錄模式來設計中國象棋軟體,其基本結構如圖21-4所示:

      在圖21-4中,Chessman充當原發器,ChessmanMemento充當備忘錄,MementoCaretaker充當負責人,在MementoCaretaker中定義了一個ChessmanMemento型別的物件,用於儲存備忘錄。完整程式碼如下所示:

//象棋棋子類:原發器
class Chessman {
	private String label;
	private int x;
	private int y;

	public Chessman(String label,int x,int y) {
		this.label = label;
		this.x = x;
		this.y = y;
	}

	public void setLabel(String label) {
		this.label = label; 
	}

	public void setX(int x) {
		this.x = x; 
	}

	public void setY(int y) {
		this.y = y; 
	}

	public String getLabel() {
		return (this.label); 
	}

	public int getX() {
		return (this.x); 
	}

	public int getY() {
		return (this.y); 
	}
	
    //儲存狀態
	public ChessmanMemento save() {
		return new ChessmanMemento(this.label,this.x,this.y);
	}
	
    //恢復狀態
	public void restore(ChessmanMemento memento) {
		this.label = memento.getLabel();
		this.x = memento.getX();
		this.y = memento.getY();
	}
}

//象棋棋子備忘錄類:備忘錄
class ChessmanMemento {
	private String label;
	private int x;
	private int y;

	public ChessmanMemento(String label,int x,int y) {
		this.label = label;
		this.x = x;
		this.y = y;
	}

	public void setLabel(String label) {
		this.label = label; 
	}

	public void setX(int x) {
		this.x = x; 
	}

	public void setY(int y) {
		this.y = y; 
	}

	public String getLabel() {
		return (this.label); 
	}

	public int getX() {
		return (this.x); 
	}

	public int getY() {
		return (this.y); 
	}	
}

//象棋棋子備忘錄管理類:負責人
class MementoCaretaker {
	private ChessmanMemento memento;

	public ChessmanMemento getMemento() {
		return memento;
	}

	public void setMemento(ChessmanMemento memento) {
		this.memento = memento;
	}
}

      編寫如下客戶端測試程式碼:

class Client {
	public static void main(String args[]) {
		MementoCaretaker mc = new MementoCaretaker();
		Chessman chess = new Chessman("車",1,1);
		display(chess);
		mc.setMemento(chess.save()); //儲存狀態		
		chess.setY(4);
		display(chess);
		mc.setMemento(chess.save()); //儲存狀態
		display(chess);
		chess.setX(5);
		display(chess);
		System.out.println("******悔棋******");	
		chess.restore(mc.getMemento()); //恢復狀態
		display(chess);
	}
	
	public static void display(Chessman chess) {
		System.out.println("棋子" + chess.getLabel() + "當前位置為:" + "第" + chess.getX() + "行" + "第" + chess.getY() + "列。");
	}
}

      編譯並執行程式,輸出結果如下:

棋子車當前位置為:第1行第1列。

棋子車當前位置為:第1行第4列。

棋子車當前位置為:第1行第4列。

棋子車當前位置為:第5行第4列。

******悔棋******

棋子車當前位置為:第1行第4列。

相關推薦

撤銷功能實現——備忘錄模式

21.3 完整解決方案      為了實現撤銷功能,Sunny公司開發人員決定使用備忘錄模式來設計中國象棋軟體,其基本結構如圖21-4所示:      在圖21-4中,Chessman充當原發器,Che

撤銷功能實現——備忘錄模式

21.4 實現多次撤銷      Sunny軟體公司開發人員通過使用備忘錄模式實現了中國象棋棋子的撤銷操作,但是使用上述程式碼只能實現一次撤銷,因為在負責人類中只定義一個備忘錄物件來儲存狀態,後面儲存的

撤銷功能實現——備忘錄模式

      每個人都有過後悔的時候,但人生並無後悔藥,有些錯誤一旦發生就無法再挽回,有些人一旦錯過就不會再回來,有些話一旦說出口就不可能再收回,這就是人生。為了不後悔,凡事我們都需要三思而後行。說了這麼

Unity如何實現網路通訊:觀察者模式以及在網路模組的應用

    首先我們來說一下什麼叫觀察者模式。觀察者模式,顧名思義,就是觀察,那麼就會有觀察者和被觀察者,比如在軍隊中,所有的軍人要聽長官的指示,軍人就是觀察者,長官就是被觀察者,長官一聲號令:“向左轉!”,長官所有的監聽者就會執行向左轉的方法,那麼這就是一個觀察者模式的流程

擴充套件系統功能——裝飾模式

12.3 完整解決方案        為了讓系統具有更好的靈活性和可擴充套件性,克服繼承複用所帶來的問題,Sunny公司開發人員使用裝飾模式來重構圖形介面構件庫的設計,其中部分類的基本結構如圖12-4

實現物件的複用——享元模式:圍棋棋子的解決方案

14.3 完整解決方案 為了節約儲存空間,提高系統性能,Sunny公司開發人員使用享元模式來設計圍棋軟體中的棋子,其基本結構如圖14-4所示: 在圖14-4中,IgoChessman充當抽象享元類,BlackIgoChessman和WhiteIgoChe

備忘錄模式Memento

ring 信息 out 根據 string 歷史 role 還原 html 備忘錄模式:在不破壞封裝性的前提下,捕捉一個對象的內部狀態,並在改對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態。 備忘錄模式比較適合功能比較復雜的,但需要維護或記錄屬性歷史的類。或

容器+AOP實現動態部署

集合 tar details class 處理 tid ret con sta 上節咱們談到容器的基本特性,這次繼續說容器怎樣與AOP進行結合。增強咱們的對象。為對象加入額外的方法。 咱們下面方圖為說明 業務對象通過busi

java設計模式模板模式

pro str pan style coff pub 調用 類定義 ted   抽象類中公開定義了執行它的方法的方式,子類可以按需求重寫方法實現,但調用將以抽象類中定義的方式進行,典型應用如銀行辦理業務流程、沖泡飲料流程。下面給出簡單例子,用沸水沖泡飲料,分為四步:將水煮沸

設計模式裝飾者模式Decorator

不知道 operation 總結 界面 都是 per @override stat override   裝飾者模式針對的問題是:對一個結構已經確定的類,在不改變該類的結構的情況下,動態增加一些功能。   一般來說,都是對一些已經寫好的架構增加自己的功能,或者應對多種情況,

設計模式---抽象工廠模式

ava des 模式 println 5.5 mage test 抽象工廠 urn 1、 簡介:為創建一組相關或相互依賴的對象提供一個接口,無需指定它們的具體類。抽象工廠模式通常是用於創創建一族產品,並且這族產品分不同的等級;不同的具體工廠類生產不同等級的一族產品。 2、

多線程:多線程設計模式:Master-Worker模式

fonts strong stat bre not 多線程 too () 部分 Master-Worker模式是常用的並行模式之一,它的核心思想是,系統有兩個進程協作工作:Master進程,負責接收和分配任務;Worker進程,負責處理子任務。當Worker進程將子任務處理

Collection的實現——學生選課

最大 es2017 語言 位置 一個數 超過 類型 img .cn 通過addAll方法往list對象添加課程: Course []course={new Course("3","離散數學"),new Course("4","匯編語言")};

設計模式 工廠模式

初始化 重要 不能 還需 new 不同 參數 裏的 作用 概述: 屬於創建型設計模式,需要生成的對象叫做產品 ,生成對象的地方叫做工廠 。 使用場景: 在任何需要生成復雜對象的地方,都可以使用工廠方法模式。 直接用new可以完成的不需要用工廠模式 下面將介紹五種工廠

用最簡單的例子說明設計模式之責任鏈、建造者、適配器、代理模式、享元模式

def dap CA 抽象 創建 tcl cte clas eth 責任鏈模式 一個請求有多個對象來處理,這些對象是一條鏈,但具體由哪個對象來處理,根據條件判斷來確定,如果不能處理會傳遞給該鏈中的下一個對象,直到有對象處理它為止 使用場景 1)有多個對象可以處理同

設計模式- 狀態模式

.get TP 導致 做到 ring bubuko 對象 狀態 一個 [toc] 狀態模式 當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類。 在平常開發自己也會遇到好多方法過長,裏面的判斷語句太多,導致後續修改十分麻煩。今天看到狀態模式的介紹,覺

設計模式:適配器模式

strong imp 引入 兩個 依賴 提高 復用 三方庫 透明度 介紹 意圖:將類的接口轉換為客戶期望的另一個接口。適配器模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。是作為兩個不兼容的接口之間的橋梁。 主要解決:主要解決在軟件系統中,常常要將一些&quo

Java設計模式之建立型模式:單例模式

一、概念: java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這裡主要介紹三種:懶漢式單例、餓漢式單例、登記式單例。 單例模式有以下特點: (1)單例類只能有一個例項; (2)單例類必須自己建立自己的唯一例項; (3)單例類必須給所有其他物件提供這一例項。 單例

常用軟體設計模式工廠方法模式

工廠方法模式:定義一個用於建立物件的介面,讓其子類決定例項化哪一個工廠類,工廠模式使其建立過程延遲到子類進行。 優點:1、一個呼叫者想建立一個物件,只要知道其名稱就可以了           

Java的設計模式

代理模式   代理模式為另一個物件提供一個替身或佔位符以控制對這個物件的訪問。   何為提供一個替身或佔位符?即一個物件代表另一個物件。有什麼事直接告訴代理物件,不必麻煩真正的物件,由代理物件來決定哪些事情去交給真正的物件。舉個例子,以前男女婚配,由男方家庭去拜託媒人,媒人轉告女方,此時媒人就是代理物件,