《大話設計模式》閱讀筆記和總結。原書是C#編寫的,本人用Java實現了一遍,包括每種設計模式的UML圖實現和示例代碼實現。
目錄:設計模式
Github地址:DesignPattern
說明
定義:中介者模式(Mediator):用一箇中介對象來封裝一系列的對象交互。中介者使各個對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變他們之間的交互。
UML圖:
代碼實現:
發起人
class Originator{
// 需要保存的屬性,可能有多個
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
// 創建備忘錄,將當前需要保存到 信息導入並實例化一個Memento對象
public Memento CreateMemento(){
return new Memento(state);
}
// 恢復備忘錄,將Memento導入並將相關數據恢復
public void setMemento(Memento memento){
state = memento.getState();
}
// 顯示數據
public void show(){
System.out.println("State="+state);
}
}
備忘錄類
class Memento {
private String state;
public Memento(String state){
this.state = state;
}
public String getState() {
return state;
}
}
管理者類
class Caretaker{
public Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
客戶端代碼
public class MementoDesign {
public static void main(String[] args) {
Originator o = new Originator();
// Origiinator初始狀態,爲“ON”
o.setState("ON");
o.show();
// 保存狀態時,由於有了很好的封裝,可以隱藏Originator的實現細節
Caretaker c = new Caretaker();
c.setMemento(o.CreateMemento());
// Origiinator改變了狀態屬性爲“OFF”
o.setState("OFF");
o.show();
// 恢復原初始狀態
o.setMemento(c.getMemento());
o.show();
}
}
運行結果
State=ON
State=OFF
State=ON
示例
例子:美國和伊拉克衝突不斷,要想解決這個問題需要通過聯合國中的聯合國安理會處理國與國之間的事情。用程序模擬聯合國安理會上美國和伊拉克辯論的情況。
UML圖:
代碼實現:
遊戲角色類
public class GameRole {
private int vitality;//生命力
private int attack;//攻擊力
private int defense;// 防禦力
public int getVitality() {
return vitality;
}
public void setVitality(int vitality) {
this.vitality = vitality;
}
public int getAttack() {
return attack;
}
public void setAttack(int attack) {
this.attack = attack;
}
public int getDefense() {
return defense;
}
public void setDefense(int defense) {
this.defense = defense;
}
/**
* 狀態顯示
*/
public void setDisplay(){
System.out.println("角色當前狀態:");
System.out.println("體力:"+ vitality);
System.out.println("攻擊力:"+ attack);
System.out.println("防禦力:"+ defense);
}
/**
* 獲得初始狀態
*/
public void GetInitState(){
vitality = 100;
attack = 100;
defense = 100;
}
/**
* 戰鬥,與大boss決戰,損耗
*/
public void fight(){
vitality = 0;
attack = 0;
defense = 0;
}
// 保存角色狀態,將三個值通過實例化:角色狀態存儲箱返回
public RoleStateMemento saveState(){
return new RoleStateMemento(vitality, attack, defense);
}
public void recoveryState(RoleStateMemento memento){
vitality = memento.getVitality();
attack = memento.getAttack();
defense = memento.getDefense();
}
}
角色狀態存儲箱類
public class RoleStateMemento {
private int vitality;//生命力
private int attack;//攻擊力
private int defense;// 防禦力
// 將生命力、攻擊力、防禦力存入狀態存儲箱對象中
public RoleStateMemento(int vitality, int attack, int defense) {
this.vitality = vitality;
this.attack = attack;
this.defense = defense;
}
public int getVitality() {
return vitality;
}
public void setVitality(int vitality) {
this.vitality = vitality;
}
public int getAttack() {
return attack;
}
public void setAttack(int attack) {
this.attack = attack;
}
public int getDefense() {
return defense;
}
public void setDefense(int defense) {
this.defense = defense;
}
}
角色狀態管理者
public class RoleStateCaretaker {
private RoleStateMemento memento;
public RoleStateMemento getMemento() {
return memento;
}
public void setMemento(RoleStateMemento memento) {
this.memento = memento;
}
}
客戶端代碼
public class Main {
public static void main(String[] args) {
// 遊戲角色初始狀態,三項指標都是100
GameRole role = new GameRole();
role.GetInitState();
role.setDisplay();
// 保存進度
RoleStateCaretaker stateAdmin = new RoleStateCaretaker();
stateAdmin.setMemento(role.saveState());
// 大戰boss的時候損失嚴重
role.fight();
role.setDisplay();
//恢復之前的狀態
role.recoveryState(stateAdmin.getMemento());
role.setDisplay();
}
}
運行效果
角色當前狀態:
體力:100
攻擊力:100
防禦力:100
角色當前狀態:
體力:0
攻擊力:0
防禦力:0
角色當前狀態:
體力:100
攻擊力:100
防禦力:100