中介者設計模式是一種非常常見的設計模式,其中我們最為熟悉的就是我們的MVC框架,其中的C作為控制器就是一個具體的中介者,它的作用是把業務邏輯(Model),和視圖(Viwe)隔離開來,使M V協調工作,把M運行的的結果和V代表的視圖融合成一個前端可以展示的頁面,減少M 和V的依賴關系,現在MVC框架也是一個非常成熟的框架,這也是中介者模式優點的一個體現。
下面是我在書上面看過的一個例子,它的大概意思就是進銷存:
如圖所示:
通過中介者之後使得各個類之間不用相互打擾,有什麼需要交互的直接通知中介者,讓中介者來統一解決。
下面我通過上面這個例子用代碼模擬出來,裡面其實也就講解了,中介者所起到的作用:
1:抽象中介者:
package mediator;
//這是一個抽象中介者,
public abstract class AbstractorMediator {
protected Purchase purchase;
protected Sale sale;
protected Stock stock;
//構造函數
public AbstractorMediator(){
purchase = new Purchase(this);
sale = new Sale(this);
stock = new Stock(this);
}
//中介者中最重要的方法 叫做事件方法,處理多個對象之間的關系。
public abstract void execute(String str,Object...objects);
}
package mediator;
/**
*這是抽象中介者的具體實現類,裡面其中定義了多個私有方法,其目的就是為了處理各個對象之間的依賴關系。
* @author Administrator
*
*/
public class Mediator extends AbstractorMediator{
@Override
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)objects[0]);
}else if(str.equals("sell.offSell")){
this.offSell();
}else if(str.equals("stock.clear")){
this.clearStock();
}
}
private void buyComputer(int number){
int saleStatus = super.sale.getSaleStatus();
if(saleStatus>80){
System.out.println("采購電腦的 "+ number+" 台");
super.stock.increase(number);
}else{
int buyNumber = number/2;
System.out.println("采購IBM電腦: "+ buyNumber+" 台");
}
}
private void sellComputer(int number){
if(super.stock.getStockNumber()<number){
super.purchase.buyIBMcomputer(number);
}
super.stock.decrease(number);
}
private void offSell(){
System.out.println("折價銷售電腦 "+ stock.getStockNumber());
}
private void clearStock(){
super.sale.offSale();
super.purchase.refuseBuyIBMcomputer();
}
}
package mediator;
/**
* 這個是同事類的抽象
* @author Administrator
*
*/
public class AbstractorColleague {
protected AbstractorMediator mediator;
public AbstractorColleague(AbstractorMediator _mediator){
this.mediator = _mediator;
}
}
package mediator;
//同事類的具體實現
public class Purchase extends AbstractorColleague{
public Purchase(AbstractorMediator _mediator) {
super(_mediator);
}
//采購電腦
public void buyIBMcomputer(int number){
super.mediator.execute("buy computer", number);
}
public void refuseBuyIBMcomputer(){
System.out.println("dont buy it");
}
}
package mediator;
import java.util.Random;
public class Sale extends AbstractorColleague{
public Sale(AbstractorMediator _mediator) {
super(_mediator);
}
//銷售電腦
public void sellIBMComputer(int number){
super.mediator.execute("sale.sell", number);
System.out.println("銷售情況 "+ number +" 台");
}
public int getSaleStatus(){
Random rand = new Random(System.currentTimeMillis());
int saleStatus = rand.nextInt(100);
System.out.println("電腦的銷售情況為:"+saleStatus);
return saleStatus;
}
//折扣處理
public void offSale(){
super.mediator.execute("sale.offSell");
}
}
package mediator;
public class Stock extends AbstractorColleague{
public Stock(AbstractorMediator _mediator) {
super(_mediator);
}
private static int COMPUTER_NUM = 100;
//增加庫存數量
public void increase(int number){
COMPUTER_NUM = COMPUTER_NUM + number;
System.out.println("庫存數量為:"+COMPUTER_NUM);
}
//減少庫存數量
public void decrease(int number){
COMPUTER_NUM = COMPUTER_NUM - number;
System.out.println("庫存數量為:"+COMPUTER_NUM);
}
//獲得庫存數量
public int getStockNumber(){
return COMPUTER_NUM;
}
//庫存壓力大了就通知 銷售人員盡快銷售
public void clearStock(){
System.out.println("清理存活數量為:"+COMPUTER_NUM);
super.mediator.execute("stock.clear");
}
}
package mediator;
//模擬客戶端的測試類,(可以通過這個類來仔細研究一下中介者設計模式的具體執行流程)
public class Client {
public static void main(String[] args) {
AbstractorMediator mediator = new Mediator();
System.out.println("采購人呀U呢采購電腦 ");
Purchase purchase = new Purchase(mediator);
purchase.buyIBMcomputer(100);
System.out.println("銷售人員銷售電腦");
Sale sale = new Sale(mediator);
sale.sellIBMComputer(1);
System.out.println("庫房裡人員清理庫存");
Stock stock = new Stock(mediator);
stock.clearStock();
}
}
中介者對象的定義:用一個中介對象封裝一系列對象交互,使各個對象不需要顯示的相互作用,從而使其耦合松散;而且可以獨立改變他們之間的交互。
其中主要有三部分構成:
1:抽象中介者角色:它統一的定義一個接口,用於各個同事之間的通信。
2:具體中介者角色:協調各個同事角色實現協調行為,因此它必須依賴各個同事角色。
3:同事角色:每一個同事角色都知道中介者角色,而且與其他同事角色進行通信的時間必須通過中介者協調。一般同事角色有兩種行為,一種是自發的行為,還有一種是必須依賴與中介者的行為 這是依賴方法。(具體可通過讀代碼)有時間我會總結一個非常通用簡單的代碼,放到這上面。
--------------------------------------分割線 --------------------------------------
編寫高質量代碼 改善Java程序的151個建議 PDF高清完整版 http://www.linuxidc.com/Linux/2014-06/103388.htm
Java 8簡明教程 http://www.linuxidc.com/Linux/2014-03/98754.htm
Java對象初始化順序的簡單驗證 http://www.linuxidc.com/Linux/2014-02/96220.htm
Java對象值傳遞和對象傳遞的總結 http://www.linuxidc.com/Linux/2012-12/76692.htm
Java對象序列化ObjectOutputStream和ObjectInputStream示例 http://www.linuxidc.com/Linux/2012-08/68360.htm
--------------------------------------分割線 --------------------------------------