1. 程式人生 > >設計模式-行為型模式-中介者模式

設計模式-行為型模式-中介者模式

設計模式-行為型模式-中介者模式

行為型模式

劃分類和物件的職責。

中介者模式

進銷存管理,即採購,銷售,庫存。

其中類圖

程式碼如下

public class Purchase {
    // 採購IBM電腦
    public void buyIBMcomputer(int number){
        // 訪問庫存
        Stock stock = new STock();
        // 訪問銷售
        Sale sale = new Sale();
        // 電腦銷售情況
        int saleStatus = sale.getSaleStatus();
        // 對銷售進行判斷
        if(saleStatus > 80){    // 銷售情況良好
            System.out.println("採購IBM電腦" + number + "臺");
            // 往庫存裡放入產品
            stock.increase(number);
        }else {
            int buyNumber = number / 2; // 折半銷售
            System.out.println("採購IBM電腦" + number + "臺");
        }
    }
    // 不再採購IBM電腦
    public void refuseBuyIBM(){
        System.out.println("不再採購IBM電腦");
    }
}

該Purchase定義了採購電腦的標準。根據電腦的銷售情況,往庫存裡放入產品。如果銷售不好,則折半銷售。
另外定義了一個不再採購IBM電腦。

庫存管理

public class Stock{
    // 初始化
    private static int COMPUTER_NUMBER = 100;
    // 庫存增加
    public void increase(int number){
        COMPUTER_NUMBER = COMPUTER_NUMBER + number;
    }
    // 庫存降低
    public void decrease(int number){
        COMPUTER_NUMBER = COMPUTER_NUMBER - number;
    }
    // 獲得庫存數量
    public int getStockNumber(){
        return COMPUTER_NUMBER;
    }
    // 通知銷售進行銷售
    public void clearStock(){
        Purchase purchase = new Purchase();
        Sale sale = new Sale();
        sale.offSale(); // 折半銷售
        purchase.refuseBuyIBM();    // 要求不再採購
    }
}

然後書寫銷售管理

public class Sale{
    // 銷售
    public void sellIBMComputer(int number){
        // 訪問庫存
        Stock stock = new Stock();
        // 訪問採購
        Purchase purchase = new Purchase();
        if(stock.getStockNumber() < number){    // 如果庫存數量不足,進行購買
            purchase.buyIBMcomputer(number);
        }
        stock.decrase(number);  // 銷售完成以後,清理庫存
    }
    // 反饋銷售情況,根據銷售判斷是否折半
    public int getSaleStatus(){
        Random rand = new Random(System.currentTimeMillis());
        int saleStatus = rand.nextint(100);
        return saleStatus;
    }
    // 進行折半銷售
    public void offSale(){
        Stock stock = new Stock();
    }
    
}

最後繪製場景

public class Client{
    public static void main(String[] args){
        // 採購人員採購電腦
        Purchase purchase = new Purchase();
        purchase.buyIBMcomputer(100);
        // 銷售電腦
        Sale sale = new Sale();
        sale.selllBMComputer(1);
        // 庫房管理人員管理庫存
        Stock stock = new Stock();
        stock.clearStock();
    }
}

改進


違反迪米特。
增加中介者

// 抽象中介者
public abstract class AbstractMediator{
    protected Purchase purchase;
    protected Sale sale;
    protected Stock stock;
    // 建構函式
    public AbstractMediator(){
        purchase = new Purchase(this);
        sale = new Sale(this);
        stock = new Stock(this);
    }
    // 事件方法,處理多個物件之間的關係
    public abstract void execute(String str, Object...objects);
}
// 產生中介者
public class Mediator extends AbstractMediator{
    public void execute(String str, Object...objects){
        if(str.equals("purchase.buy")){ // 如果需要採購電腦
            this.buyComputer((Integer)objects[0]);  // 通知採購
        }else if(str.equals("sale sell")){  // 銷售電腦
            this.sellComputer((Integer)object[0]);
        }else if(str.equals("sale offsell")){   // 折半銷售
            this.offSell();
        }else if(str.equals("stock clear")){    // 清倉處理
            this.clearStock();
        }
    }
    private void buyComputer(int number){
        int saleStatus = super.sale.getSaleStatus();
        if(saleStatus > 80){    // 如果銷售良好
            super.stock.increase(number);
        }else{
            int buyNumber = number / 2;
        }
    }
    private void sellComputer(int number){
        if(super.stock.getStockNumber() < number){ // 庫存不夠銷售的時候
            super.purchase.buyIBMcomputer(number);
        }
        super.stock.decrease(number);
    }
    // 折半銷售電腦
    private void offSell(){
        
    }
    // 清倉處理
    private void clearStock(){
        // 要求清倉銷售
        super.sale.offSale();
        // 要求採購人員不要採購
        super.purchase.refuseBuyIBM();
    }
}

然後對同事進行抽象

public abstract class AbstractColleague{
    protected AbstractMediator mediator;
    public AbstractColleagur(AbstractMediator _mediator){
        this.mediator = _mediator;
    }
}

採購類

public class Purchase extends AbstractColleague{
    public Purchase(AbstractMediator _mediator){    // 和中介建立聯絡
        super(_mediator);
    }
    // 採購電腦
    public void buyIBMcomputer(int number){
        super.meidator.execute("purchase.buy", number);
    }
    // 不在採購電腦
    public void refuseBuyIBM(){
        
    }
}

對於庫存管理

public class Stock extends AbstractColleague{
    public Stock(ABstractMediator _mediator){
        super(_meidator);
    }
    // 剛剛開始電腦
    private static int COMPUTER_NUMBER = 100;
    // 庫存通知
    public void increase(int number){
        COMPUTER_NUMBER = COMPUTER_NUMBRT + number;
    }
    // 庫存降低
    public void decrease(int number){
        COMPUTER_NUMBER = COMPUTER_NUMBER - number;
    }
    // 獲得庫存數量
    public int getStockNumber(){
        return COMPUTER_NUMBER;
    }
    // 存貨量多,不採購,進行銷售
    public void clearStock(){
        super.mediator.execute("stock.clear");
    }
}

銷售管理,類似不在闡述。
對於場景類進行修改如下

public class Client{
    public static void main(String[] args){
        AbstractMediator mediator = new Mediator();
        Purchase purchase = new Purchase(mediator); // 傳入具體的場景
        purchase.buyIBMcomputer(100);
        Sale sale = new Sale(mediator);
        sale.sellIBMComputer(1);
        Stock stock = new Stock(mediator);
        stock.clearStock();
    }
}

應用

MVC,閘道器,一個購物車栗子,需求為選擇顏色,並輸入購買數量,要求和從後臺獲取到的庫存進行對比,在頁面顯示。思路,為三方,庫存資料,輸入資料,顯示結果,引入中介者,在中介者內部進行資料的判斷,並將結果輸出,如果此時需要增加新的選項,直接在中介者內部書寫業務程式碼即可。

總結

有中介者和同事類,中介者通過get和set方法將同事傳入,然後進行資料的交換,中介完成任務,然後同事類,通過構造方法將中介傳入,然後和中介進行交流,獲取資訊。
中介,get,set傳入同事,進行資料處理,交換。
同事,通過構造傳入,進行和中介通訊。