編輯:關於android開發
中介者模式也稱為調解者模式或調停者模式,是一種行為型模式。
中介者模式包裝了一系列對象相互作用的方式,使得這些對象不必相互明顯作用。從而使它們可以松散耦合。當某些對象之間的作用發生改變時,不會立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨立的變化。
當對象之間的交互操作很多且每個對象的行為操作都依賴彼此時,為防止在修改一個對象的行為時,同時涉及很多其他對象的行為,可使用中介者模式。
(1)Mediator:抽象中介者角色,定義了同事對象到中介者對象的接口,一般以抽象類的方式實現。
(2)ConcreteMediator:具體中介者角色,繼承於抽象中介者,實現了父類定義的方法,它從具體的同事對象接受消息,向具體同事對象發出命令。
(3)Colleague:抽象同事類角色,定義了中介者對象的接口,它只知道中介者而不知道其他的同事對象。
(4)ConcreteColleague1、ConcreteColleague2:具體同事類角色,繼承於抽象同事類,每個具體同事類都知道本身在小范圍的行為,而不知道在大范圍內的目的。
在電腦中,主機部分主要分為:CPU、內存、顯卡、IO設備,而將它們整合起來的就是主板,這裡主板就是一個中介者。以此為例。
抽象中介者:
public abstract class Mediator {
/**
* 同事對象改變時通知中介者的方法
* 在同事對象改變時由中介者去通知其他的同事對象
*
* @param c 同事對象
*/
public abstract void changed(Colleague c);
}
抽象同事:
public abstract class Colleague {
protected Mediator mediator;//每一個同事都該知道其中介者
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
}
CPU同事:
public class CPU extends Colleague{
private String dataVideo, dataSound; //視頻和音頻數據
public CPU(Mediator mediator) {
super(mediator);
}
/**
* 獲取視頻數據
*
* @return 視頻數據
*/
public String getDataVideo(){
return dataVideo;
}
/**
* 獲取音頻數據
*
* @return 音頻數據
*/
public String getDataSound(){
return dataSound;
}
/**
* 解碼數據
*
* @param data音、視頻數據
*/
public void decodeData(String data){
//分割音、視頻數據
String[] tmp = data.split(",");
//解析音、視頻數據
dataVideo = tmp[0];
dataSound = tmp[1];
//告訴中介者自身狀態改變
mediator.changed(this);
}
}
光驅同事:
public class CDDevice extends Colleague{
private String data; //視頻數據
public CDDevice(Mediator mediator) {
super(mediator);
}
/**
* 讀取視頻數據
*
* @return 視頻數據
*/
public String read(){
return data;
}
/**
* 加載視頻數據
*
* @return 音頻數據
*/
public void load(){
data = "視頻數據,音頻數據";
//告訴中介者自身狀態改變
mediator.changed(this);
}
}
顯卡同事:
public class GraphicsCard extends Colleague{
public GraphicsCard(Mediator mediator) {
super(mediator);
}
/**
* 播放視頻數據
*
* @param 視頻數據
*/
public void videoPlay(String data){
System.out.println("視頻:" + data);
}
}
聲卡同事:
public class SoundCard extends Colleague{
public SoundCard(Mediator mediator) {
super(mediator);
}
/**
* 播放音頻數據
*
* @param 音頻數據
*/
public void soundPlay(String data){
System.out.println("音頻:" + data);
}
}
主板中介者:
public class MainBoard extends Mediator{
private CDDevice cdDevice; //光驅設備
private CPU cpu; //CPU
private SoundCard soundCard; //聲卡設備
private GraphicsCard graphicsCard; //顯卡設備
@Override
public void changed(Colleague c) {
//如果光驅讀取了數據
if(c == cdDevice){
handleCD((CDDevice) c);
}
//如果CPU處理完數據
else if(c == cpu){
handleCD((CPU) c);
}
}
/**
* 處理光驅讀取數據後與其他設備的交互
*
* @param cdDevice 光驅設備
*/
public void handleCD(CDDevice cdDevice){
cpu.decodeData(cdDevice.read());
}
/**
* 處理CPU讀取數據後與其他設備的交互
*
* @param cpu CPU
*/
public void handleCD(CPU cpu){
soundCard.soundPlay(cpu.getDataSound());
graphicsCard.videoPlay(cpu.getDataVideo());
}
/**
* 設置CD設備
*
* @param CDDevice CD設備
*/
public void setCDDevice(CDDevice cdDevice){
this.cdDevice = cdDevice;
}
/**
* 設置CPU
*
* @param cpu CPU
*/
public void setCPU(CPU cpu){
this.cpu = cpu;
}
/**
* 設置聲卡設備
*
* @param soundCard 聲卡設備
*/
public void setSoundCard(SoundCard soundCard){
this.soundCard = soundCard;
}
/**
* 設置顯卡設備
*
* @param graphicsCard 顯卡設備
*/
public void setGraphicsCard(GraphicsCard graphicsCard){
this.graphicsCard = graphicsCard;
}
}
播放電影:
public class Client {
public static void main(String[] args) {
//構造主板對象
MainBoard mediator = new MainBoard();
//分別構造各個零件
CDDevice cd = new CDDevice(mediator);
CPU cpu = new CPU(mediator);
GraphicsCard gc = new GraphicsCard(mediator);
SoundCard sc = new SoundCard(mediator);
//將各個零件安裝到主板
mediator.setCDDevice(cd);
mediator.setCPU(cpu);
mediator.setGraphicsCard(gc);
mediator.setSoundCard(sc);
//播放電影
cd.load();
}
}
結果:
音頻:音頻數據
視頻:視頻數據
可以看出中介者模式將多對多的相互作用轉化為一對多的相互作用,將系統從網狀結構變為以中介者為中心的星形結構(這裡就是主板),達到降低系統的復雜性,提高可擴展性。
其實在Android開發中我們可能無意間就使用了中介者模式,比如登錄注冊界面,我們使用EditText的addTextChangedListener監聽輸入密碼的位數、用戶名是否為空,密碼與確認密碼是否一致等等判斷時,此時多個控件交互,就是由Activity充當中介者來協調。
(1)適當地使用中介者模式可以避免同事類之間的過度耦合,使得各同事類之間可以相對獨立地使用。
(2)使用中介者模式可以將對象的行為和協作進行抽象,能夠比較靈活的處理對象間的相互作用。
(3)使用中介者模式可以將對象間多對多的關聯轉變為一對多的關聯,使對象間的關系易於理解和維護。
中介者模式是一種比較常用的模式,也是一種比較容易被濫用的模式。對於大多數的情況,同事類之間的關系不會復雜到混亂不堪的網狀結構,因此,大多數情況下,將對象間的依賴關系封裝的同事類內部就可以的,沒有必要非引入中介者模式。濫用中介者模式,只會讓事情變的更復雜。所以,我們決定使用中介者模式之前要多方考慮、權衡利弊。
48.Android 標簽TextView的點擊技巧 48.Android 標簽TextView的點擊技巧 Android 標簽TextView的點擊技巧 前言 Clic
eclipse安裝genymotion插件。,eclipsegenymotion 先發個我自己壓縮的genymotion和Virtu
Android事件分發機制總結 理解事件的分發機制,需要對View和ViewGroup事件的分發分別探討。View和ViewGroup的區別,一個View控件是指它裡面不
android ndk開發(二)實現一個官方demo,androidndk實現了一個官方的demo:bitmap-plasma(水波紋) 源代碼就在samples文件夾下