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

duanhao發表於2021-09-09

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

行為型模式

劃分類和物件的職責。

中介者模式

進銷存管理,即採購,銷售,庫存。
圖片描述

其中類圖
圖片描述

程式碼如下

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傳入同事,進行資料處理,交換。
同事,透過構造傳入,進行和中介通訊。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1343/viewspace-2818285/,如需轉載,請註明出處,否則將追究法律責任。

相關文章