歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java中介者設計模式

中介者設計模式是一種非常常見的設計模式,其中我們最為熟悉的就是我們的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

--------------------------------------分割線 --------------------------------------

Copyright © Linux教程網 All Rights Reserved