日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

设计模式之中介者模式(mediator模式)

發(fā)布時(shí)間:2025/3/20 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之中介者模式(mediator模式) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • 引入中介者模式
  • 中介者模式實(shí)例
  • 中介者模式分析

引入中介者模式

大家想象一下有十個(gè)人要共同完成一個(gè)工作,他們要互相合作和溝通,并且根據(jù)對(duì)方的通知可能要改變自己的狀態(tài),但這通常會(huì)帶來很多問題,流程過于復(fù)雜,使得每個(gè)人不僅要專注于自己的事情,還要與他人進(jìn)行溝通,得到通知,需要兼顧很多狀態(tài)的變化。這時(shí)候,我們考慮可以引入一個(gè)類似上帝視角的角色,就是引入一個(gè)中介者,他來負(fù)責(zé)接受每個(gè)人的通知,并將變化發(fā)送所需要的人去,就是要他來控制并調(diào)節(jié)工作的進(jìn)度和細(xì)節(jié),這個(gè)人往往是從整體考慮的,所以使得每個(gè)人工作者只需要考慮自己的問題,一旦有了變化,就通知仲裁者,交給仲裁者去決定就可以了。 所以最后就變成了,整個(gè)團(tuán)隊(duì)的交流過程,組員向中介者報(bào)告,中介者向組員下達(dá)只命令。 這在現(xiàn)實(shí)生活中也是常見的,每個(gè)部門通常都會(huì)有一個(gè)領(lǐng)導(dǎo)人,每個(gè)班級(jí)有一個(gè)班長(zhǎng),往往是班長(zhǎng)負(fù)責(zé)接受同學(xué)們的信息,然后將上面的信息從班長(zhǎng)這里發(fā)給同學(xué)們,這里的班長(zhǎng)就相當(dāng)于一個(gè)仲裁者,同學(xué)們就相當(dāng)于組員。

這就是中介者模式的基本思想,mediator有仲裁者和中介者的意思,一方面,當(dāng)麻煩事情發(fā)生的時(shí)候,通知仲裁者,當(dāng)發(fā)生設(shè)計(jì)全體組員的事情時(shí),也通知仲裁者。當(dāng)仲裁者下達(dá)指示的時(shí)候,組員會(huì)立即執(zhí)行。團(tuán)隊(duì)組員之間不再互相溝通并私自做決定,而是發(fā)生任何事情都像仲裁者報(bào)告。另一方面,仲裁者在整個(gè)團(tuán)隊(duì)的角度上對(duì)組員報(bào)告的事情進(jìn)行決定。

中介者模式的實(shí)例

我們通過一個(gè)gui程序來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的仲裁者模式

看上圖是一個(gè)我們經(jīng)常見的登錄框。通常登錄框就設(shè)計(jì)很多狀態(tài)的變化,比如我們這個(gè)例子就要實(shí)現(xiàn)如下的邏輯

首先,如果選擇用戶登錄,那么用戶名輸入框處于啟用狀態(tài),但密碼輸入框處于禁用狀態(tài),如下圖

如果用戶輸入了用戶名,密碼框就啟用,如下圖

如果又刪掉了用戶名,那么密碼又變回禁用狀態(tài)

如果選擇游客登錄,就都處于禁用狀態(tài)。

假設(shè)我們有這樣的需求,那么我們應(yīng)該如何編寫程序呢? 最先的想法就是,每個(gè)控件分別分別接受相關(guān)控件的狀態(tài),根據(jù)不同的狀態(tài)在改變自己的狀態(tài)。這樣做是可以實(shí)現(xiàn)功能的,但是假設(shè)這時(shí)候我們新加一個(gè)控件進(jìn)來,那么由于這個(gè)邏輯分散在各個(gè)控件的代碼中,所以我們修改起來非常麻煩,而且每個(gè)控件都充斥著狀態(tài)控制的代碼,很臃腫,控件應(yīng)該專注于實(shí)現(xiàn)自己的邏輯。 因?yàn)檫@些控件都相互關(guān)聯(lián),相互制約的,全部耦合在一起。 根據(jù)面向?qū)ο蟮脑O(shè)計(jì)原則,我們應(yīng)該盡量對(duì)象過度耦合,實(shí)現(xiàn)松耦合的狀態(tài)。

于是,我們就可以利用中介者模式,每個(gè)控件發(fā)生了變化,我們就把變化發(fā)給中介者,中介者統(tǒng)一來處理,這樣控件就只需要專注于自己的實(shí)現(xiàn)就行了。

首先看類圖:

首先,定義Mediator接口

public interface Mediator {public abstract void createColleagues();public abstract void colleagueChanged(); }復(fù)制代碼

定義Colleague接口

public interface Colleague {public abstract void setMediator(Mediator mediator);public abstract void setColleagueEnabled(boolean enabled); }復(fù)制代碼

實(shí)現(xiàn)三個(gè)colleague類:

import java.awt.Button;public class ColleagueButton extends Button implements Colleague {private Mediator mediator;public ColleagueButton(String caption) {super(caption);}public void setMediator(Mediator mediator) { // 保存Mediatorthis.mediator = mediator;}public void setColleagueEnabled(boolean enabled) { // Mediator下達(dá)啟用/禁用的指示 setEnabled(enabled);} }復(fù)制代碼import java.awt.Checkbox; import java.awt.CheckboxGroup; import java.awt.event.ItemListener; import java.awt.event.ItemEvent;public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague {private Mediator mediator;public ColleagueCheckbox(String caption, CheckboxGroup group, boolean state) { // 構(gòu)造函數(shù) super(caption, group, state);}public void setMediator(Mediator mediator) { // 保存Mediatorthis.mediator = mediator;}public void setColleagueEnabled(boolean enabled) { // Mediator下達(dá)啟用/禁用指示setEnabled(enabled);}public void itemStateChanged(ItemEvent e) { // 當(dāng)狀態(tài)發(fā)生變化時(shí)通知Mediatormediator.colleagueChanged();} }復(fù)制代碼import java.awt.TextField; import java.awt.Color; import java.awt.event.TextListener; import java.awt.event.TextEvent;public class ColleagueTextField extends TextField implements TextListener, Colleague {private Mediator mediator;public ColleagueTextField(String text, int columns) { // 構(gòu)造函數(shù)super(text, columns);}public void setMediator(Mediator mediator) { // 保存Mediatorthis.mediator = mediator;}public void setColleagueEnabled(boolean enabled) { // Mediator下達(dá)啟用/禁用的指示setEnabled(enabled);setBackground(enabled ? Color.white : Color.lightGray);}public void textValueChanged(TextEvent e) { // 當(dāng)文字發(fā)生變化時(shí)通知Mediatormediator.colleagueChanged();} }復(fù)制代碼

最后實(shí)現(xiàn)具體的中介者對(duì)象

import java.awt.Frame; import java.awt.Label; import java.awt.Color; import java.awt.CheckboxGroup; import java.awt.GridLayout; import java.awt.event.ActionListener; import java.awt.event.ActionEvent;public class LoginFrame extends Frame implements ActionListener, Mediator {private ColleagueCheckbox checkGuest;private ColleagueCheckbox checkLogin;private ColleagueTextField textUser;private ColleagueTextField textPass;private ColleagueButton buttonOk;private ColleagueButton buttonCancel;// 構(gòu)造函數(shù)。// 生成并配置各個(gè)Colleague后,顯示對(duì)話框。public LoginFrame(String title) {super(title);setBackground(Color.lightGray);// 使用布局管理器生成4×2窗格setLayout(new GridLayout(4, 2));// 生成各個(gè)ColleaguecreateColleagues();// 配置add(checkGuest);add(checkLogin);add(new Label("Username:"));add(textUser);add(new Label("Password:"));add(textPass);add(buttonOk);add(buttonCancel);// 設(shè)置初始的啟用起用/禁用狀態(tài)colleagueChanged();// 顯示pack();show();}// 生成各個(gè)Colleague。public void createColleagues() {// 生成CheckboxGroup g = new CheckboxGroup();checkGuest = new ColleagueCheckbox("Guest", g, true);checkLogin = new ColleagueCheckbox("Login", g, false);textUser = new ColleagueTextField("", 10);textPass = new ColleagueTextField("", 10);textPass.setEchoChar('*');buttonOk = new ColleagueButton("OK");buttonCancel = new ColleagueButton("Cancel");// 設(shè)置MediatorcheckGuest.setMediator(this);checkLogin.setMediator(this);textUser.setMediator(this);textPass.setMediator(this);buttonOk.setMediator(this);buttonCancel.setMediator(this);// 設(shè)置ListenercheckGuest.addItemListener(checkGuest);checkLogin.addItemListener(checkLogin);textUser.addTextListener(textUser);textPass.addTextListener(textPass);buttonOk.addActionListener(this);buttonCancel.addActionListener(this);}// 接收來自于Colleage的通知然后判斷各Colleage的啟用/禁用狀態(tài)。public void colleagueChanged() {if (checkGuest.getState()) { // Guest modetextUser.setColleagueEnabled(false);textPass.setColleagueEnabled(false);buttonOk.setColleagueEnabled(true);} else { // Login modetextUser.setColleagueEnabled(true);userpassChanged();}}// 當(dāng)textUser或是textPass文本輸入框中的文字發(fā)生變化時(shí)// 判斷各Colleage的啟用/禁用狀態(tài)private void userpassChanged() {if (textUser.getText().length() > 0) {textPass.setColleagueEnabled(true);if (textPass.getText().length() > 0) {buttonOk.setColleagueEnabled(true);} else {buttonOk.setColleagueEnabled(false);}} else {textPass.setColleagueEnabled(false);buttonOk.setColleagueEnabled(false);}}public void actionPerformed(ActionEvent e) {System.out.println(e.toString());System.exit(0);} } 復(fù)制代碼

Main類

import java.awt.*; import java.awt.event.*;public class Main {static public void main(String args[]) {new LoginFrame("Mediator Sample");} } 復(fù)制代碼

運(yùn)行結(jié)果

中介者模式分析

中介者模式主要有幾個(gè)角色

  • 中介者 就是負(fù)責(zé)定義控制邏輯,接受來自組員的消息并處理的接口,對(duì)應(yīng)實(shí)例中的Mediator接口
  • 具體的中介者 實(shí)現(xiàn)接口,并根據(jù)不同的需求,做出不同的邏輯
  • 同事組員Colleague 組員的接口,定義相應(yīng)的方法
  • 具體的組員 負(fù)責(zé)實(shí)現(xiàn)具體的組員邏輯,并將通知直接交給中介者執(zhí)行

中介者模式的類圖:

總結(jié)

以上是生活随笔為你收集整理的设计模式之中介者模式(mediator模式)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。