中介者模式

《大話設計模式》閱讀筆記和總結。原書是C#編寫的银酗,本人用Java實現了一遍辆影,包括每種設計模式的UML圖實現和示例代碼實現徒像。
目錄:設計模式
Github地址:DesignPattern

說明

定義:中介者模式(Mediator):用一個中介對象來封裝一系列的對象交互。中介者使各個對象不需要顯式地相互引用蛙讥,從而使其耦合松散锯蛀,而且可以獨立地改變他們之間的交互。

UML圖:

中介者模式UML圖.png

代碼實現:

發(fā)起人

class Originator{
    // 需要保存的屬性次慢,可能有多個
    private String state;
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
    
    // 創(chuàng)建備忘錄旁涤,將當前需要保存到 信息導入并實例化一個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初始狀態(tài)迫像,為“ON”
        o.setState("ON");
        o.show();
        
        // 保存狀態(tài)時劈愚,由于有了很好的封裝,可以隱藏Originator的實現細節(jié)
        Caretaker c = new Caretaker();
        c.setMemento(o.CreateMemento());
        
        // Origiinator改變了狀態(tài)屬性為“OFF”
        o.setState("OFF");
        o.show();
        
        // 恢復原初始狀態(tài)
        o.setMemento(c.getMemento());
        o.show();
    }
}

運行結果

State=ON
State=OFF
State=ON

示例

例子:美國和伊拉克沖突不斷闻妓,要想解決這個問題需要通過聯合國中的聯合國安理會處理國與國之間的事情菌羽。用程序模擬聯合國安理會上美國和伊拉克辯論的情況。

UML圖:

中介者模式示例UML圖.png

代碼實現:

游戲角色類

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;
    }
    
    /**
     * 狀態(tài)顯示
     */
    public void setDisplay(){
        System.out.println("角色當前狀態(tài):");
        System.out.println("體力:"+ vitality);
        System.out.println("攻擊力:"+ attack);
        System.out.println("防御力:"+ defense);
    }
    
    /**
     * 獲得初始狀態(tài)
     */
    public void GetInitState(){
        vitality = 100;
        attack = 100;
        defense = 100;
    }
    
    /**
     * 戰(zhàn)斗由缆,與大boss決戰(zhàn)注祖,損耗
     */
    public void fight(){
        vitality = 0;
        attack = 0;
        defense = 0;
    }
    
    // 保存角色狀態(tài),將三個值通過實例化:角色狀態(tài)存儲箱返回
    public RoleStateMemento saveState(){
        return new RoleStateMemento(vitality, attack, defense);
    }
    
    public void recoveryState(RoleStateMemento memento){
        vitality = memento.getVitality();
        attack = memento.getAttack();
        defense = memento.getDefense();
    }
}

角色狀態(tài)存儲箱類

public class RoleStateMemento {
    private int vitality;//生命力
    private int attack;//攻擊力
    private int defense;// 防御力
    
    // 將生命力均唉、攻擊力是晨、防御力存入狀態(tài)存儲箱對象中
    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;
    }
    
}

角色狀態(tài)管理者

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) {
        // 游戲角色初始狀態(tài),三項指標都是100
        GameRole role = new GameRole();
        role.GetInitState();
        role.setDisplay();
        
        // 保存進度
        RoleStateCaretaker stateAdmin = new RoleStateCaretaker();
        stateAdmin.setMemento(role.saveState());
        
        // 大戰(zhàn)boss的時候損失嚴重
        role.fight();
        role.setDisplay();
        
        //恢復之前的狀態(tài)
        role.recoveryState(stateAdmin.getMemento());
        role.setDisplay();
    }
}

運行效果

角色當前狀態(tài):
體力:100
攻擊力:100
防御力:100
角色當前狀態(tài):
體力:0
攻擊力:0
防御力:0
角色當前狀態(tài):
體力:100
攻擊力:100
防御力:100
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末舔箭,一起剝皮案震驚了整個濱河市罩缴,隨后出現的幾起案子,更是在濱河造成了極大的恐慌层扶,老刑警劉巖箫章,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異怒医,居然都是意外死亡,警方通過查閱死者的電腦和手機奢讨,發(fā)現死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門稚叹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拿诸,你說我怎么就攤上這事扒袖。” “怎么了亩码?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵季率,是天一觀的道長。 經常有香客問我描沟,道長飒泻,這世上最難降的妖魔是什么鞭光? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮泞遗,結果婚禮上惰许,老公的妹妹穿的比我還像新娘。我一直安慰自己史辙,他們只是感情好汹买,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著聊倔,像睡著了一般晦毙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耙蔑,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天见妒,我揣著相機與錄音,去河邊找鬼纵潦。 笑死徐鹤,一個胖子當著我的面吹牛,可吹牛的內容都是我干的邀层。 我是一名探鬼主播返敬,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寥院!你這毒婦竟也來了劲赠?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤秸谢,失蹤者是張志新(化名)和其女友劉穎凛澎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體估蹄,經...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡塑煎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了臭蚁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片最铁。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖垮兑,靈堂內的尸體忽然破棺而出冷尉,到底是詐尸還是另有隱情,我是刑警寧澤系枪,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布雀哨,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏雾棺。R本人自食惡果不足惜膊夹,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垢村。 院中可真熱鬧割疾,春花似錦、人聲如沸嘉栓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侵佃。三九已至麻昼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間馋辈,已是汗流浹背抚芦。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留迈螟,地道東北人叉抡。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像答毫,于是被迫代替她去往敵國和親褥民。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內容