日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

一文徹底搞明白中介模式

來源: 責編: 時間:2024-05-16 09:08:48 148觀看
導讀本篇講解Java設計模式中的中介模式,分為定義、模式應用前案例、結構、模式應用后案例、適用場景、模式可能存在的困惑和本質探討7個部分。定義中介模式是用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要

本篇講解Java設計模式中的中介模式,分為定義、模式應用前案例、結構、模式應用后案例、適用場景、模式可能存在的困惑和本質探討7個部分。eiM28資訊網——每日最新資訊28at.com

定義

中介模式是用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。eiM28資訊網——每日最新資訊28at.com

在新的分類方式中,中介模式模式被劃分至類之間的交互類別中,其簡化的是一組類之間復雜的交互關系。eiM28資訊網——每日最新資訊28at.com

eiM28資訊網——每日最新資訊28at.com

模式應用前案例

現實生活中房屋中介用于連接眾多買賣的雙方,其實就是中介模式在現實中的應用,下面我們就拿這個案例來進行說明。先來看一下未使用中介模式前的代碼實現。eiM28資訊網——每日最新資訊28at.com

public class Buyer {//買家private final String name;public Buyer(String name) {this.name = name;    }public void sendMessage(Seller seller, String message) {        System.out.println(this.name + " sends a message: " + message+ " to " + seller.getName());    }public String getName() {return this.name;    }}public class Seller {//賣家private final String name;public Seller(String name) {this.name = name;    }public void sendMessage(Buyer buyer, String message) {        System.out.println(this.name + " sends a message: " + message + " to " + buyer.getName());    }public String getName() {return this.name;    }}public class Client {//調用者代碼public static void main(String[] args) {// 創建兩個賣家對象        Seller seller1 = new Seller("Seller A");        Seller seller2 = new Seller("Seller B");//創建兩個買家對象        Buyer buyer1 = new Buyer("Buyer A");        Buyer buyer2 = new Buyer("Buyer B");// 直接讓賣家之間進行通信        seller1.sendMessage(buyer1, "Hello, are you interested in collaborating?");        seller2.sendMessage(buyer2, "Yes, I am open to collaboration opportunities.");// 其他邏輯...    }}

從上述代碼來看,最主要的問題就是買家類和賣家類直接發生耦合,后續維護非常困難。eiM28資訊網——每日最新資訊28at.com

結構

eiM28資訊網——每日最新資訊28at.com

中介模式的示例代碼實現如下。eiM28資訊網——每日最新資訊28at.com

public abstract class Colleague {protected  Mediator mediator;public Colleague(Mediator mediator){this.mediator = mediator;    }public abstract void send(String message);public abstract void receive(String message);}public class ConcreteColleague1 extends Colleague{public ConcreteColleague1(Mediator mediator) {super(mediator);    }@Overridepublic void send(String message) {        System.out.println("Colleague 1 sends: " + message);        mediator.send(message, this);    }@Overridepublic void receive(String message) {        System.out.println("Colleague 1 receives: " + message);    }}public class ConcreteColleague2 extends Colleague{public ConcreteColleague2(Mediator mediator) {super(mediator);    }@Overridepublic void send(String message) {        System.out.println("Colleague 2 sends: " + message);        mediator.send(message, this);    }@Overridepublic void receive(String message) {        System.out.println("Colleague 2 receives: " + message);    }}public abstract class Mediator {public abstract void send(String message, Colleague colleague);}public class ConcreteMediator extends Mediator{private ConcreteColleague1 colleague1;private ConcreteColleague2 colleague2;public void setColleague1(Colleague colleague1) {this.colleague1 = (ConcreteColleague1) colleague1;    }public void setColleague2(Colleague colleague2) {this.colleague2 = (ConcreteColleague2) colleague2;    }@Overridepublic void send(String message, Colleague colleague) {if (colleague == colleague1) {            colleague2.receive("Message from 1 to 2");        } else if (colleague == colleague2) {            colleague1.receive("Message from 2 to 1");        }    }}public class Client {public static void main(String[] args) {        ConcreteMediator mediator = new ConcreteMediator();        Colleague colleague1 = new ConcreteColleague1(mediator);        Colleague colleague2 = new ConcreteColleague2(mediator);        mediator.setColleague1(colleague1);        mediator.setColleague2(colleague2);        colleague1.send("Hello from A");        colleague2.send("Hello from B");    }}

從中介模式的結構來看,原來Colleague的各個實現類之間需要直接交互,現在交互邏輯統一移到Mediator實現類中實現,從而Colleague各個實現類之間可以實現松耦合。eiM28資訊網——每日最新資訊28at.com

模式應用后案例

上面房屋中介的案例,在使用中介模式之后的代碼實現如下。eiM28資訊網——每日最新資訊28at.com

買家和賣家的家族類如下。eiM28資訊網——每日最新資訊28at.com

public interface IPerson {// 買家賣家接口String getName();void sendMessage(String message);void receiveMessage(String message);}public class Buyer implements IPerson{//具體買家類private final String name;private final IEstateMediator mediator;public Buyer(IEstateMediator mediator, String name){this.mediator=mediator;this.name=name;        mediator.registerPerson(this);    }@Overridepublic String getName(){return this.name;}@Overridepublic void sendMessage(String msg){//System.out.print(this.name +" sends a message: "+msg+"/n");this.mediator.sendMessage(msg,this);    }@Overridepublic void receiveMessage(String msg){        System.out.print(this.name +" receives a messages:"+msg+"/n");    }}public class Seller implements IPerson {// 具體賣家類private final String name;private final IEstateMediator mediator;public Seller(IEstateMediator mediator, String name){this.mediator=mediator;this.name=name;        mediator.registerPerson(this);    }@Overridepublic String getName(){return this.name;}@Overridepublic void sendMessage(String msg){//System.out.print(this.name +" sends a message: "+msg+"/n");this.mediator.sendMessage(msg,this);    }@Overridepublic void receiveMessage(String msg){        System.out.print(this.name +" receives a messages:"+msg+"/n");    }}

房屋中介的家族類如下。eiM28資訊網——每日最新資訊28at.com

public interface IEstateMediator {//中介者接口void registerPerson(IPerson person);void sendMessage(String message, IPerson person);}public class RealEstateMediator implements IEstateMediator {public List<IPerson> getSellers() {return this.sellers;    }public List<IPerson> getBuyers() {return this.buyers;    }private final List<IPerson> sellers = new ArrayList<>();private final List<IPerson> buyers = new ArrayList<>();@Overridepublic void registerPerson(IPerson person) {if(person instanceof Seller) {this.sellers.add(person);        }else if(person instanceof Buyer) {this.buyers.add(person);        }    }@Overridepublic void sendMessage(String message, IPerson person) {// 具體中介者類if(person instanceof Seller) {//說明是賣家發給買家for(IPerson buyer : this.buyers) {// 處理從賣家發出的消息,并轉發給其他買家                System.out.println(person.getName() + " sends message: " + message +" to " + buyer.getName());                buyer.receiveMessage(message);            }        }else if(person instanceof  Buyer) {//說明是買家發給賣家for(IPerson seller : this.sellers) {// 處理從買家發出的消息,并轉發給其他賣家                System.out.println(person.getName() + " sends message: " + message +" to " + seller.getName());                seller.receiveMessage(message);            }        }    }}

最后,調用方代碼實現如下。eiM28資訊網——每日最新資訊28at.com

public class Client {//調用方代碼public static void main(String[] args) {// 創建房地產中介對象        IEstateMediator mediator = new RealEstateMediator();// 創建兩個賣家對象,并注冊到房地產中介        IPerson seller1 = new Seller(mediator, "Seller A");        IPerson seller2 = new Seller(mediator, "Seller B");// 創建兩個買家對象,并注冊到房地產中介        IPerson buyer1 = new Buyer(mediator, "Buyer A");        IPerson buyer2 = new Buyer(mediator, "Buyer B");// 賣家發送消息給其他買家        seller1.sendMessage("Hello, I am a seller, are you interested in collaborating?");        seller2.sendMessage("Yes, I am a seller, I am open to collaboration opportunities.");// 買家發送消息給其他賣家        buyer1.sendMessage("Hello, I am a buyer, are you interested in collaborating?");        buyer2.sendMessage("Yes, I am a buyer, I am open to collaboration opportunities.");// 其他邏輯...    }}

從最終的調用方代碼來看,買家和賣家在發送消息時,都不需要再關注具體的賣家或買家,兩者之間實現松耦合。買家和賣家之間關系的邏輯都放在房屋中介類中實現。eiM28資訊網——每日最新資訊28at.com

適用場景

中介者模式適用于以下場景:eiM28資訊網——每日最新資訊28at.com

1)一組對象以定義良好但是復雜的方式進行通信。產生的相互依賴關系結構混亂且難以理解eiM28資訊網——每日最新資訊28at.com

2)一個對象引用其它很多對象并且直接與這些對象通信,導致難以復用該對象。eiM28資訊網——每日最新資訊28at.com

3)需要通過一個中心化的調度器來協調多個對象之間的交互,并減少對象直接通信帶來的復雜性時eiM28資訊網——每日最新資訊28at.com

4)希望能夠降低系統內各個組件之間依賴關系、提高系統靈活性和可維護性時,可以使用中介者模式eiM28資訊網——每日最新資訊28at.com

5)一些具有交互邏輯但不應該彼此直接知道對方存在的類eiM28資訊網——每日最新資訊28at.com

模式可能存在的困惑

困惑1:在中介者結構中,中介Mediator家族類被定性為核心類。我們知道Mediator及實現類中只是負責管理關系,似乎核心業務邏輯還是在Colleage實現類中,如何解釋?eiM28資訊網——每日最新資訊28at.com

現實世界中很多場景下,實際上關系本身可能要比產生關系的具體系統要更有價值。比如,對于房屋中介,能盡快促成交易的前提是必須維護很多買家和賣家,并通過大數據分析,找到可能潛在會發生交易的買家和賣家之間的關系,這種關系的發現本身是很有價值的。因此,中介家族類歸屬于核心類別中。eiM28資訊網——每日最新資訊28at.com

本質

在面向對象的很多場景應用中,我們會盡量簡化眾多交互者之間的關系,比如通過減少交互數量或者將交互確定性等手段。eiM28資訊網——每日最新資訊28at.com

然而,現實中也有一些場景,眾多交互者之間確實有交互的需求,并且這種交互具有不確定性。eiM28資訊網——每日最新資訊28at.com

中介者模式的本質在于通過管理關系的復雜性獲得價值,從而使發生關系的眾多參與方解耦。eiM28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-88367-0.html一文徹底搞明白中介模式

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Fo-Dicom開源庫是如何進行模塊劃分的

下一篇: Elasticsearch 電商場景:明明有這個關鍵詞,但是搜不出來,怎么辦?

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 南雄市| 黔南| 新兴县| 双峰县| 铁力市| 衡阳县| 淳化县| 景洪市| 中牟县| 温州市| 曲松县| 常熟市| 喜德县| 武穴市| 顺平县| 西林县| 中卫市| 明光市| 江门市| 会同县| 拉萨市| 永福县| 保亭| 南和县| 长子县| 安泽县| 海盐县| 营口市| 申扎县| 越西县| 周口市| 确山县| 宽甸| 吴堡县| 连城县| 西乌珠穆沁旗| 连江县| 华宁县| 钟祥市| 包头市| 金溪县|