編輯:關於Android編程
中介者模式也稱為調解者模式或調停者模式,是一種行為型模式。
中介者模式包裝了一系列對象相互作用的方式,使得這些對象不必相互明顯作用。從而使它們可以松散耦合。當某些對象之間的作用發生改變時,不會立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨立的變化。
當對象之間的交互操作很多且每個對象的行為操作都依賴彼此時,為防止在修改一個對象的行為時,同時涉及很多其他對象的行為,可使用中介者模式。
vcq9yrXP1qGjPC9wPg0KPHA+o6gyo6lDb25jcmV0ZU1lZGlhdG9yo7o8c3Ryb25nPr7fzOXW0L3p1d+9x8mrPC9zdHJvbmc+o6y8zLPQ09qz6c/z1tC96dXfo6zKtc/Wwcu4uMDgtqjS5bXEt723qKOsy/y0077fzOW1xM2sysK21M/zvdPK3M/7z6KjrM/yvt/M5c2sysK21M/zt6Kz9sP8we6hozwvcD4NCjxwPqOoM6OpQ29sbGVhZ3Vlo7o8c3Ryb25nPrPpz/PNrMrCwOC9x8mrPC9zdHJvbmc+o6y2qNLlwcvW0L3p1d+21M/ztcS907/ao6zL/Na71qq1wNbQvenV37b4srvWqrXAxuTL+7XEzazKwrbUz/OhozwvcD4NCjxwPqOoNKOpQ29uY3JldGVDb2xsZWFndWUxoaJDb25jcmV0ZUNvbGxlYWd1ZTKjujxzdHJvbmc+vt/M5c2sysLA4L3Hyas8L3N0cm9uZz6jrLzMs9DT2rPpz/PNrMrCwOCjrMO/uPa+38zlzazKwsDgtrzWqrXAsb7J7dTa0KG3ts6ntcTQ0M6qo6y2+LK71qq1wNTatPO3ts6nxNq1xMS/tcShozwvcD4NCjxoMiBpZD0="4簡單實現">4.簡單實現
在電腦中,主機部分主要分為: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)使用中介者模式可以將對象間多對多的關聯轉變為一對多的關聯,使對象間的關系易於理解和維護。
中介者模式是一種比較常用的模式,也是一種比較容易被濫用的模式。對於大多數的情況,同事類之間的關系不會復雜到混亂不堪的網狀結構,因此,大多數情況下,將對象間的依賴關系封裝的同事類內部就可以的,沒有必要非引入中介者模式。濫用中介者模式,只會讓事情變的更復雜。所以,我們決定使用中介者模式之前要多方考慮、權衡利弊。
運行結果:為了在坦克上方畫血條 。血條首先要有坐標x,y 寬和高width和height血量的多少life也要有。所以新建類Life要有這些參數Life類如下: 
之前介紹了Android系統下三種數據存儲形式,http://www.jb51.net/article/99468.htm。今天補充介紹另外兩種,分別是內容提供者和網絡存
小米klo bugreport是小米系統中的一個軟件,很多使用小米手機的用戶都見到過這款軟件,那麼小米klo bugreport是什麼軟件?小米klo bu
在開發應用程序的時候,經常會遇到這樣的情況,會在運行時動態根據條件來決定顯示哪個View或某個布局。那麼最通常的想法就是把可能用到的View都寫在上面,先把它們的可見性都