智慧型家庭專案:
智慧型家庭包括各種裝置,鬧鐘、咖啡機、電視機、窗簾 等
傳統方式:
類圖:
傳統的方式的問題分析
由上圖可以看出,呼叫關係比較複雜
當各電器物件有多種狀態改變時,相互之間的呼叫關係會比較複雜
各個電器物件彼此聯絡, 你中有我,我中有你,不利於松耦合
各個電器物件之間所傳遞的訊息(引數),容易混亂
當系統增加乙個新的電器物件時,或者執行流程改變時,**的可維護性、擴充套件性都不理想 ==> 考慮中介者模式
中介者模式(mediator pattern
) , 用乙個中介物件來封裝一系列的物件互動。中介者使各個物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動
中介者模式屬於行為型模式, 使**易於維護
比如mvc
模式,c
(controller
控制器)是m
(model
模型)和v
(view
檢視)的中介者,在前後端互動時起到了中間人的作用
中介者模式的原理類圖
mediator
就是抽象中介者,定義了中介者的行為規範
colleague
是抽象的同事類,定義了同事類中抽象的行為規範
concretemediator
具體的中介者物件,實現mediator
中的抽象方法,他需要知道所有具體的同事類,即以乙個集合來管理所有的同事(hashmap
),並接收某個同事的訊息,完成相應的任務
concretecolleague
具體的同事類,colleague
的實現類會有很多,每個同事只知道自己的行為, 而不了解其他同事類的行為(方法),但是他們都依賴中介者物件(通過構造器將中介者注入)
原本同事之間複雜的呼叫關係和業務邏輯,都交給中介者去執行,這樣具體的同事類之間耦合度就會降低
類圖:
類圖說明
建立concretemediator
物件,並使用mediator
型別接收
建立各個同事類物件,比如alarm
、coffeemachine
、tv
等
在建立同事類物件時,就直接通過構造器注入乙個mediator
物件,同時將同事類物件新增至mediator
的同事類集合中去
在同事類物件中呼叫sendmessage()
方法時,會去用mediator
物件中的getmessage()
方法
getmessage()
方法會根據會根據當前接收到的訊息,去呼叫其他同事,協同完成其他任務,即getmessage()
方法會處理很多的業務邏輯,是乙個核心方法
**實現 :
同事類,即為各種家電的抽象父類,通過構造器將中介者物件注入,抽象父類中的sendmessage()
由子類重寫,該方法將呼叫中介者的getmessage()
方法觸發執行動作
//同事抽象類
public abstract class colleague
public mediator getmediator()
public abstract void sendmessage(int statechange);
}
各個同事類的實現
//鬧鐘類
public class alarm extends colleague
public void sendalarm(int statechange)
@override
public void sendmessage(int statechange)
}//咖啡機
public class coffeemachine extends colleague
@override
public void sendmessage(int statechange)
public void startcoffee()
public void finishcoffee()
}//電視
public class tv extends colleague
@override
public void sendmessage(int statechange)
public void starttv()
public void stoptv()
}// 窗簾
public class curtains extends colleague
@override
public void sendmessage(int statechange)
public void upcurtains()
}
中介物件的規範介面
public abstract class mediator
繼承了mediator
抽象父類,實現了其父類中的抽象方法,register()
完成註冊的功能,呼叫getmessage()
方法將執行目標任務 ,可以發現,同事類直接複雜的呼叫流程,全部集中到了 中介類中
//具體的中介者類
public class concretemediator extends mediator
@override
public void register(string colleaguename, colleague colleague) else if (colleague instanceof coffeemachine) else if (colleague instanceof tv) else if (colleague instanceof curtains)
} // 具體中介者的核心方法
// 1. 根據得到訊息,完成對應任務
// 2. 中介者在這個方法,協調各個具體的同事物件,完成任務
@override
public void getmessage(int statechange, string colleaguename) else if (statechange == 1)
} else if (colleaguemap.get(colleaguename) instanceof coffeemachine) else if (colleaguemap.get(colleaguename) instanceof tv) else if (colleaguemap.get(colleaguename) instanceof curtains)
} @override
public void sendmessage()
}
測試**
public class clienttest
}
總結中介者(mediator
)將各種家電物件分隔開來,家電與家電之間沒有發生關聯,家電執行的任務都是交給中介者觸發中介者模式可以提高程式的可擴充套件性,比如我們新增**類phone
,我們只需要修改concretemediator
中的**即可實現擴充套件
多個類相互耦合, 會形成網狀結構,使用中介者模式將網狀結構分離為星型結構, 進行解耦
減少類間依賴, 降低了耦合, 符合迪公尺特原則
中介者承擔了較多的責任, 一旦中介者出現了問題, 整個系統就會受到影響
如果設計不當, 中介者物件本身變得過於複雜, 這點在實際使用時, 要特別注意
中介者模式
1.中間 類 namespace intermediarypattern 成員物件需要知道是哪個中介者在通知它事情 public abstract class member 各成員間要傳送訊息 public abstract void send string msg 這個方法其實是具體實施發訊息的 ...
中介者模式
中介者模式就是在物件之間的關係很複雜時用,名如其人,就像租房的黑中介一樣,如果每個房東都拿著很多租房者的資訊很麻煩,每個租房者都要拿著很多房東的資訊也麻煩,所以需要乙個中介來拿著這些資訊,租房者只需要發出租房的請求,中介會給你介紹合適的房東,房東只需要提交房屋資料就等著中介的人帶著訪客看房拿錢就行了...
中介者模式
中介者模式 mediator pattern 1 抽象中介者 mediator 角色 抽象中介者角色定義統一的介面用於各同事角色之間的通訊。具體中介者 concrete mediator 角色 具體中介者角色通過協調各同事角色實現協作行為,因此它必須依賴於各個同事角色。同事 colleague 角色...