多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > 偽中介模式(5.5)

偽中介模式(5.5)

來源:程序員人生   發布時間:2014-09-30 01:54:00 閱讀次數:2687次

中介模式(mediator pattern)是一種“平臺式”或“管家式”委派方式。

中介模式中,中介是各個希望相互交互的參與者的共同且唯一代理,它完成消息的轉發或處理。

平臺式中介

現實生活中有集市、股票交易所、婚姻介紹所、房屋中介等形形色色的中介(mediator)組織,它們有效地將參與者(participator)的兩兩交互轉化為參與者與中介的交互。但是,這些中介正好是GoF中介模式的錯誤例子。網上有許多人用QQ為例引入中介模式,顯然沒有從代碼的角度分析,純屬想當然

這里說一個現實的場景。一場Party,有男生/Boy、女生/Girl參加,每個人都可以與其他對象交互。請問,實現這一場景的代碼有多復雜?只有當你真正寫出代碼時,你會發現10萬個對象的彼此交談,也不過兩個類的代碼要寫。

例程 5 9 不需要中介 package delegate.mediator.party; public abstract class Actor{ String name; public abstract void send(String message,Actor to); public abstract void receive(String message,Actor from); } package delegate.mediator.party; import static tool.Print.*; public class Boy extends Actor{ private int count; public Boy(String name){ this.name =name; } @Override public void send(String message,Actor to){ pln(this.name+" To "+to.name+":""+message+"""); to.receive(message,this); } @Override public void receive(String message,Actor from){ char c = (char)(Math.random()*4+'a'); if(c!='b'){ String msg = message+" "+c; send(msg,from); } } } package delegate.mediator.party; public class Party{ public static void main(){ Actor[] alist = new Actor[]{ new Boy("B1"),new Boy("B2"),new Boy("B3"),new Boy("B4"), new Girl("G1"),new Girl("G2"),new Girl("G3") }; for(int i=0;i<alist.length;i++){ int rand= (int)(Math.random()*alist.length); alist[i].send("hi",alist[rand]); } } }

測試代碼中,每一個Party參與者發起一次對話,對話的對象是隨機的。對話的內容為隨機字符,對話必須持續直到隨機字符為b(bay)才結束。某一次運行結果(”//結束“不是程序的輸出):

B1 To B4:"hi"
B4 To B1:"hi d"
B1 To B4:"hi d d"
B4 To B1:"hi d d a"
B1 To B4:"hi d d a a" //結束
B2 To B3:"hi" //結束
B3 To G2:"hi"//結束
B4 To B1:"hi"//結束
G1 To G2:[hi]
G2 To G1:[hi d]
G1 To G2:[hi d d]
G2 To G1:[hi d d d]
G1 To G2:[hi d d d a]
G2 To G1:[hi d d d a d]
G1 To G2:[hi d d d a d c]
G2 To G1:[hi d d d a d c a]
G1 To G2:[hi d d d a d c a a]
G2 To G1:[hi d d d a d c a a a]
G1 To G2:[hi d d d a d c a a a a]
G2 To G1:[hi d d d a d c a a a a c] //居然聊了這么多 //結束
G2 To B2:[hi]
B2 To G2:"hi c"
G2 To B2:[hi c a]
B2 To G2:"hi c a a"
G2 To B2:[hi c a a a]
B2 To G2:"hi c a a a c"
G2 To B2:[hi c a a a c a]
G3 To G1:[hi]

在討論中介模式時,許多人看到對象的交互呈現網狀結構,幾乎每個對象都需要與其他對象發生相互作用。[GoF]中介者模式:“定義一個中介對象來封裝系列對象之間的交互。中介者使各個對象不需要顯示地相互引用,從而使其耦合性松散,而且可以獨立地改變他們之間的交互”。事實上,上述代碼告訴了一個事實,這里不需要中介模式:

①各對象之間并不需要“顯式”持有彼此的引用。Boy和Girl是Actor的子類,即使Party中出現了Boy和Girl等具體類型,Boy和Girl的類體中依賴Actor即可。②多個類(Boy、Girl)的大量對象的交互,并不一定會導致類之間的過度耦合。Boy和Girl之間就不存在任何耦合。類似的,讓家長、老師等參加Party,只要他們是Actor,彼此之間不存在任何耦合。

所以,上面的例子并不是我們需要中介(這里不是中介模式)的原因。

然而,如果有一個對象需要找一個女朋友,他一個個地與每一個Girl對象交互,就顯得非常低效和不現實。此時,他需要一個能夠廣播的“平臺”。平臺式的中介中,不管參與者如何形形色色,中介的作用如同一個公告牌。所以非常容易地聯想到觀察者模式,事實上,作為公告牌的“中介模式”就是觀察者模式

于是,由于中介者Party現在作為交互平臺,它被所有感興趣的參與者觀察!再次不同于[GoF]中介者模式。[GoF]中,它寫道“將Mediator實現為一個觀察者,各Colleague作為Subject”。而此時,我們的代碼是:Mediator實現為一個Subject,各Colleague作為Observer。

這一“平臺式中介的代碼,網上隨處可見。

對象和類

[GoF]中介者模式:“定義一個中介對象來封裝系列對象之間的交互。中介者使各個對象不需要顯示地相互引用,從而使其耦合性松散..."

這也給我們帶來一個問題:這里的”對象“是什么東西

在Java等面向對象的語言中,yqj2065一直強調:類是第一性的。程序員編程針對的都是類而非對象。事實上,[GoF]的中介者模式――“管家式”委派方式中,才體現了一個類(的對象)發生狀態改變,將導致許多其他類(的對象)發生相應的變化。和股票交易所、婚姻介紹所等不同,后者雖然參與者有諸多對象,真正的類不多而且交互簡單。

有人說了:Party中有的男女對上眼了,會一直聊到Party結束;有的男生可以一直聊籃球;有的女生只和女生聊,有的女生只和名字好聽的人聊……你怎么處理這些對象?

還是一句話:我將處理的不是對象而是類――匿名類!你可以用匿名類或λ表達式為客戶留下無限的擴展空間。


總之,股票交易所、婚姻介紹所、聊天室的例子,都不是[GoF]中介者模式



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 三级全黄在线观看www桃花 | 最近的最新的中文字幕在线 | 欧欧美18videosex性哦欧美美 | 伊人99在线观看 | 四虎东方va私人影库在线观看 | 日本护士xxxx黑人巨大 | 国产综合在线播放 | 国产欧美日韩一区二区三区视频 | 亚洲精品1区| 欧美一级毛片一级 | 亚洲毛片在线 | 国产精品视频播放 | 在线看福利片 | 视频在线观看免费视频 | 欧美一级日韩 | 1000部精品久久久久久久久 | 动漫美女羞羞网站 | 国产精品αv在线观看 | 91精品日韩 | 成人a级高清视频在线观看 成人a毛片高清视频 | 欧美一区二区三区在线观看不卡 | 午夜精品同性女女 | 国产一区二区在线不卡 | 免费黄网址 | 中国特黄特级真人毛片 | 国产高清成人吃奶成免费视频 | riav久久中文一区二区 | 免费h视频网站 | 中文字幕日本不卡一二三区 | 大学生一一级毛片在线播放 | 亚洲邪恶 | 日本午夜视频在线观看 | 麻豆国产96在线 | 日韩 | 日本高清www视频在线观看 | 国产成人精品日本亚洲18图 | 亚洲a人| 毛片网站网址 | 久久精品视频6 | 亚洲精品乱码久久久久久蜜桃欧美 | www.日本高清.com | 12306播播影视播播影院午夜 |