1. 程式人生 > >設計模式的藝術 行為型模式之中介者模式

設計模式的藝術 行為型模式之中介者模式

前言

微信有一個群聊功能,群聊中的資訊你不需要加別人為好友就可以接收的到資訊,因為群的機制,極大的減少了使用者之間的兩兩通訊,在軟體設計中,也有類似於微信使用者之間的關係,我們也可以借鑑微信群的模式,來降低物件與物件之間的互動,使得系統的耦合度大大降低

什麼是中介者模式 Mediator Pattern

用一箇中介者物件來封裝一系列的物件互動,中介者使得物件不需要顯式的互相引用,從而使得其耦合鬆散,而且可以獨立地改變它們之間的互動,中介者模式又稱之為調停者模式,它是一種物件行為型模式

中介者模式的優點

(1)、中介者模式簡化了物件之間的互動,它用中介者和同事的一對多互動代替了原來同事之間的多對多互動,一對多關係更容易理解,維護,擴充套件,將原來難以理解的網狀結構轉換成為相對簡單的星型結構

(2)、中介者模式可將同事物件解耦。中介者有利於各同事之間的鬆耦合,可以獨立地改變和複用每一個同事和中介者,增加新的中介者和新的同事都比較方便,更好地符合開閉原則

(3)、可以減少大量同事子類生成,中介者將原來分佈於多個物件間的行為集中在一起,改變這些行為只需要生成新的中介者子類即可,這使得各個同事類可以被複用,無須對同事類進行擴充套件

中介者模式的缺點

在具體中介者中包含了大量同事之間的互動細節,可能會使得具體中介者類非常複雜,使得系統難以維護

中介者模式適用的場景

(1)、系統中物件之間存在複雜的引用關係,系統結構混亂且難以理解

(2)、一個物件由於引用了其他很多物件並且直接和這些物件直接通訊,導致難以複用該物件

(3)、想通過一箇中間類來封裝多個類的行為,而又不想生成太多的子類,可以通過引入中介者類來實現,在中介者中定義物件互動的公共行為,如果需要改變行為則可以增加新的具體中介者類

中介者模式的具體實現

目錄結構

抽象同事類

package com.company.component;

import com.company.Mediator;

//抽象同事類
public abstract class Component {
    protected Mediator mediator;

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }
    //轉發呼叫
    public void changed(){
        mediator.componentChanged(this);
    }
    public abstract void update();
}

具體同事類

package com.company.component;

//按鈕類:具體同事類
public class Button extends Component {
    @Override
    public void update() {
    //按鈕不產生相應
    }
}
package com.company.component;

//組合框類:具體同事類
public class ComboBox extends Component {
    @Override
    public void update() {
        System.out.println("組合框增加一項:張無忌");
    }
    public void select(){
        System.out.println("組合框選中項:小龍女");
    }
}
package com.company.component;

//檔案標籤類:具體同事類
public class Label extends Component {
    @Override
    public void update() {
        System.out.println("文字標籤內容改變,客戶資訊總數加一");
    }
}
package com.company.component;

//列表框類:具體同事類
public class List extends Component {
    @Override
    public void update() {
        System.out.println("列表框增加一項:張無忌");
    }
    public void select(){
        System.out.println("列表框選中項:小龍女");
    }
}
package com.company.component;

//文字框類:具體同事類
public class TextBox extends Component {
    @Override
    public void update() {
        System.out.println("客戶資訊增加成功後文本框清空");
    }
    public void setText(){
        System.out.println("文字框顯示:小龍女");
    }
}

抽象中介者類

package com.company;

import com.company.component.Component;

//抽象中介者
public abstract class Mediator {
    public abstract void componentChanged(Component component);
}

具體中介者類

package com.company;

import com.company.component.*;

//具體中介者
public class ConcreteMediator extends Mediator {
    //維持對各個物件的引用
    public Button addButton;
    public List list;
    public TextBox userNameTextBox;
    public ComboBox cb;
    @Override
    //封裝同事物件之間的互動
    public void componentChanged(Component component) {
            //單擊按鈕
        if(component==addButton){
            System.out.println("--單擊增加按鈕--");
            list.update();
            cb.update();
            userNameTextBox.update();
        }
        //從列表框選擇客戶
        else  if(component==list){
                System.out.println("--從列表框選擇客戶--");
                cb.select();
                userNameTextBox.setText();
        }else  if(component==cb){
            System.out.println("--從組合框選擇客戶--");
            cb.select();
            userNameTextBox.setText();
        }
    }
}
package com.company;

import com.company.component.Component;
import com.company.component.Label;

public class SubConcreteMediator extends ConcreteMediator {
            //增加對Label物件的引用
            public Label label;
    //封裝同事物件之間的互動
    public void componentChanged(Component component) {
        //單擊按鈕
        if(component==addButton){
            System.out.println("--單擊增加按鈕--");
            list.update();
            cb.update();
            userNameTextBox.update();
            label.update();  //文字標籤更新
        }
        //從列表框選擇客戶
        else  if(component==list){
            System.out.println("--從列表框選擇客戶--");
            cb.select();
            userNameTextBox.setText();
        }else  if(component==cb){
            System.out.println("--從組合框選擇客戶--");
            cb.select();
            userNameTextBox.setText();
        }
    }
}

測試類

package com.company;

import com.company.component.*;

public class Main {

    public static void main(String[] args) {
   /*定義中介者物件
        Mediator mediator;*/
   //用新的具體中介者定義中介者物件
        SubConcreteMediator mediator;
        mediator=new SubConcreteMediator();
        //定義同事物件
        Button addBT=new Button();
        List list=new List();
        ComboBox cb=new ComboBox();
        TextBox userNameTB=new TextBox();
        Label label=new Label();

        addBT.setMediator(mediator);
        list.setMediator(mediator);
        cb.setMediator(mediator);
        userNameTB.setMediator(mediator);
        label.setMediator(mediator);

        ((ConcreteMediator) mediator).addButton=addBT;
        ((ConcreteMediator) mediator).list=list;
        ((ConcreteMediator) mediator).cb=cb;
        ((ConcreteMediator) mediator).userNameTextBox=userNameTB;
        mediator.label=label;
        addBT.changed();;
        System.out.println("----------------------");
        list.changed();
    }
}

轉載請註明出處,掌聲送給社會人