自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一文徹底搞明白中介模式

開發(fā) 前端
在面向?qū)ο蟮暮芏鄨鼍皯?yīng)用中,我們會盡量簡化眾多交互者之間的關(guān)系,比如通過減少交互數(shù)量或者將交互確定性等手段。

本篇講解Java設(shè)計模式中的中介模式,分為定義、模式應(yīng)用前案例、結(jié)構(gòu)、模式應(yīng)用后案例、適用場景、模式可能存在的困惑和本質(zhì)探討7個部分。

定義

中介模式是用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。

在新的分類方式中,中介模式模式被劃分至類之間的交互類別中,其簡化的是一組類之間復(fù)雜的交互關(guān)系。

模式應(yīng)用前案例

現(xiàn)實生活中房屋中介用于連接眾多買賣的雙方,其實就是中介模式在現(xiàn)實中的應(yīng)用,下面我們就拿這個案例來進行說明。先來看一下未使用中介模式前的代碼實現(xiàn)。

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 {//調(diào)用者代碼

public static void main(String[] args) {
// 創(chuàng)建兩個賣家對象
        Seller seller1 = new Seller("Seller A");
        Seller seller2 = new Seller("Seller B");

//創(chuàng)建兩個買家對象
        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.");

// 其他邏輯...
    }
}

從上述代碼來看,最主要的問題就是買家類和賣家類直接發(fā)生耦合,后續(xù)維護非常困難。

結(jié)構(gòu)

中介模式的示例代碼實現(xiàn)如下。

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);
    }

@Override
public void send(String message) {
        System.out.println("Colleague 1 sends: " + message);
        mediator.send(message, this);
    }

@Override
public void receive(String message) {
        System.out.println("Colleague 1 receives: " + message);
    }
}

public class ConcreteColleague2 extends Colleague{
public ConcreteColleague2(Mediator mediator) {
super(mediator);
    }

@Override
public void send(String message) {
        System.out.println("Colleague 2 sends: " + message);
        mediator.send(message, this);
    }

@Override
public 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;
    }

@Override
public 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");
    }
}

從中介模式的結(jié)構(gòu)來看,原來Colleague的各個實現(xiàn)類之間需要直接交互,現(xiàn)在交互邏輯統(tǒng)一移到Mediator實現(xiàn)類中實現(xiàn),從而Colleague各個實現(xiàn)類之間可以實現(xiàn)松耦合。

模式應(yīng)用后案例

上面房屋中介的案例,在使用中介模式之后的代碼實現(xiàn)如下。

買家和賣家的家族類如下。

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);
    }

@Override
public String getName(){
return this.name;}

@Override
public void sendMessage(String msg){
//System.out.print(this.name +" sends a message: "+msg+"\n");
this.mediator.sendMessage(msg,this);
    }

@Override
public 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);
    }

@Override
public String getName(){
return this.name;}

@Override
public void sendMessage(String msg){
//System.out.print(this.name +" sends a message: "+msg+"\n");
this.mediator.sendMessage(msg,this);
    }

@Override
public void receiveMessage(String msg){
        System.out.print(this.name +" receives a messages:"+msg+"\n");
    }

}

房屋中介的家族類如下。

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<>();

@Override
public void registerPerson(IPerson person) {

if(person instanceof Seller) {
this.sellers.add(person);
        }else if(person instanceof Buyer) {
this.buyers.add(person);
        }
    }

@Override
public void sendMessage(String message, IPerson person) {// 具體中介者類

if(person instanceof Seller) {//說明是賣家發(fā)給買家
for(IPerson buyer : this.buyers) {
// 處理從賣家發(fā)出的消息,并轉(zhuǎn)發(fā)給其他買家
                System.out.println(person.getName() + " sends message: " + message +" to " + buyer.getName());
                buyer.receiveMessage(message);
            }
        }else if(person instanceof  Buyer) {//說明是買家發(fā)給賣家
for(IPerson seller : this.sellers) {
// 處理從買家發(fā)出的消息,并轉(zhuǎn)發(fā)給其他賣家
                System.out.println(person.getName() + " sends message: " + message +" to " + seller.getName());
                seller.receiveMessage(message);
            }
        }

    }
}

最后,調(diào)用方代碼實現(xiàn)如下。

public class Client {//調(diào)用方代碼

public static void main(String[] args) {
// 創(chuàng)建房地產(chǎn)中介對象
        IEstateMediator mediator = new RealEstateMediator();

// 創(chuàng)建兩個賣家對象,并注冊到房地產(chǎn)中介
        IPerson seller1 = new Seller(mediator, "Seller A");
        IPerson seller2 = new Seller(mediator, "Seller B");

// 創(chuàng)建兩個買家對象,并注冊到房地產(chǎn)中介
        IPerson buyer1 = new Buyer(mediator, "Buyer A");
        IPerson buyer2 = new Buyer(mediator, "Buyer B");

// 賣家發(fā)送消息給其他買家
        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.");

// 買家發(fā)送消息給其他賣家
        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.");
// 其他邏輯...
    }
}

從最終的調(diào)用方代碼來看,買家和賣家在發(fā)送消息時,都不需要再關(guān)注具體的賣家或買家,兩者之間實現(xiàn)松耦合。買家和賣家之間關(guān)系的邏輯都放在房屋中介類中實現(xiàn)。

適用場景

中介者模式適用于以下場景:

1)一組對象以定義良好但是復(fù)雜的方式進行通信。產(chǎn)生的相互依賴關(guān)系結(jié)構(gòu)混亂且難以理解

2)一個對象引用其它很多對象并且直接與這些對象通信,導(dǎo)致難以復(fù)用該對象。

3)需要通過一個中心化的調(diào)度器來協(xié)調(diào)多個對象之間的交互,并減少對象直接通信帶來的復(fù)雜性時

4)希望能夠降低系統(tǒng)內(nèi)各個組件之間依賴關(guān)系、提高系統(tǒng)靈活性和可維護性時,可以使用中介者模式

5)一些具有交互邏輯但不應(yīng)該彼此直接知道對方存在的類

模式可能存在的困惑

困惑1:在中介者結(jié)構(gòu)中,中介Mediator家族類被定性為核心類。我們知道Mediator及實現(xiàn)類中只是負責(zé)管理關(guān)系,似乎核心業(yè)務(wù)邏輯還是在Colleage實現(xiàn)類中,如何解釋?

現(xiàn)實世界中很多場景下,實際上關(guān)系本身可能要比產(chǎn)生關(guān)系的具體系統(tǒng)要更有價值。比如,對于房屋中介,能盡快促成交易的前提是必須維護很多買家和賣家,并通過大數(shù)據(jù)分析,找到可能潛在會發(fā)生交易的買家和賣家之間的關(guān)系,這種關(guān)系的發(fā)現(xiàn)本身是很有價值的。因此,中介家族類歸屬于核心類別中。

本質(zhì)

在面向?qū)ο蟮暮芏鄨鼍皯?yīng)用中,我們會盡量簡化眾多交互者之間的關(guān)系,比如通過減少交互數(shù)量或者將交互確定性等手段。

然而,現(xiàn)實中也有一些場景,眾多交互者之間確實有交互的需求,并且這種交互具有不確定性。

中介者模式的本質(zhì)在于通過管理關(guān)系的復(fù)雜性獲得價值,從而使發(fā)生關(guān)系的眾多參與方解耦。

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2024-05-09 09:09:19

組合模式對象

2024-05-10 08:43:04

外觀模式接口系統(tǒng)

2024-05-11 14:18:44

迭代器模式業(yè)務(wù)

2024-05-17 10:08:59

享元模式分類方式

2024-05-15 17:41:37

備忘錄模式多線程

2019-08-27 14:46:59

ElasticSearES數(shù)據(jù)庫

2020-07-10 08:03:35

DNS網(wǎng)絡(luò)ARPAne

2023-05-29 08:45:45

Java注解數(shù)據(jù)形式

2023-03-13 08:12:37

Golang編程路徑問題

2019-09-09 11:02:17

Nginx進程模型

2021-05-06 08:03:07

IPIP網(wǎng)絡(luò)模式calicok8s

2023-11-06 09:06:54

分布式一致性數(shù)據(jù)

2019-10-28 10:19:27

JVM 類加載器Java

2021-06-30 08:45:02

內(nèi)存管理面試

2020-03-18 14:00:47

MySQL分區(qū)數(shù)據(jù)庫

2023-10-27 08:15:45

2022-06-07 10:13:22

前端沙箱對象

2022-05-30 10:37:35

分布式事務(wù)反向補償

2020-12-07 06:19:50

監(jiān)控前端用戶

2021-07-08 10:08:03

DvaJS前端Dva
點贊
收藏

51CTO技術(shù)棧公眾號