《大話設計模式》閱讀筆記和總結。原書是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