Java設(shè)計(jì)模式之中介者模式的實(shí)現(xiàn)方式
介紹
Java中介者模式(Mediator Pattern)是一種行為設(shè)計(jì)模式,它可以降低多個(gè)對象之間的耦合性,通過一個(gè)中介者對象來協(xié)調(diào)這些對象的交互.
在中介者模式中,多個(gè)對象之間的交互不是直接進(jìn)行的,而是通過一個(gè)中介者對象來進(jìn)行的.這個(gè)中介者對象封裝了對象之間的交互邏輯,每個(gè)對象只需要與中介者對象進(jìn)行通信,而不需要與其他對象直接進(jìn)行通信.這種模式可以有效的減少代碼的復(fù)雜度和維護(hù)成本,提高系統(tǒng)的可擴(kuò)展性和可維護(hù)性.
在Java中, 中介者模式可以通過一個(gè)接口或抽象類來定義中介者對象,該中介者對象可以定義一些方法來處理對象之間的通信.同時(shí),需要實(shí)現(xiàn)一些具體的對象類,這些對象類需要持有中介者對象,并且需要實(shí)現(xiàn)一些方法來與中介者對象進(jìn)行通信.通過這種方式,可以實(shí)現(xiàn)對象之間的解耦,提高代碼的可讀性和可維護(hù)性.
實(shí)現(xiàn)
抽象中介者
public abstract class Mediator {
public abstract void send(String message, Colleague colleague);
}
具體中介者
public class ConcreteMediator extends Mediator{
private ConcreteColleague1 concreteColleague1;
private ConcreteColleague2 concreteColleague2;
public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) {
this.concreteColleague1 = concreteColleague1;
}
public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) {
this.concreteColleague2 = concreteColleague2;
}
@Override
public void send(String message, Colleague colleague) {
if (colleague == concreteColleague1){
concreteColleague2.receive(message);
}else {
concreteColleague1.receive(message);
}
}
}
抽象同事類
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
/**
* 發(fā)送消息
*
* @param message
*/
public abstract void send(String message);
/**
* 消費(fèi)消息
* @param message
*/
public abstract void receive(String message);
}
具體同事類
public class ConcreteColleague1 extends Colleague {
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
/**
* 發(fā)送消息
*
* @param message
*/
@Override
public void send(String message) {
mediator.send(message, this);
}
/**
* 消費(fèi)消息
*
* @param message
*/
@Override
public void receive(String message) {
System.out.println("concreteColleague1收到消息:" + message);
}
}
public class ConcreteColleague2 extends Colleague {
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
/**
* 發(fā)送消息
*
* @param message
*/
@Override
public void send(String message) {
mediator.send(message, this);
}
/**
* 消費(fèi)消息
*
* @param message
*/
@Override
public void receive(String message) {
System.out.println("concreteColleague2收到消息:" + message);
}
}
測試
public class Demo {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleague1 concreteColleague1 = new ConcreteColleague1(mediator);
ConcreteColleague2 concreteColleague2 = new ConcreteColleague2(mediator);
mediator.setConcreteColleague1(concreteColleague1);
mediator.setConcreteColleague2(concreteColleague2);
concreteColleague1.send("Hello concreteColleague2");
concreteColleague2.send("Hello concreteColleague1");
}
}

在上面代碼中,抽象中介者M(jìn)ediator定義了同事類之間通信的接口,具體中介者類ConcreteMediator實(shí)現(xiàn)了這個(gè)接口,并持有同事類列表.抽象同事類Colleague定義了同事類的通信接口,具體同事類ConcreteColleague1和ConcreteColleague2分別實(shí)現(xiàn)了這個(gè)接口,實(shí)現(xiàn)了具體的通信邏輯.在測試代碼中,我們創(chuàng)建了一個(gè)中介者對象,然后創(chuàng)建了兩個(gè)同事對象并將他們加入到中介者對象的同事列表中,最后測試了它們之間的通信.
總結(jié)
優(yōu)點(diǎn):
- 降低了對象之間的耦合度,是的它們更加容易被獨(dú)立地修改,測試和維護(hù).
- 通過集中管理和協(xié)調(diào)對象之間的交互,可以更加靈活地?cái)U(kuò)展和修改系統(tǒng),而不會(huì)對其他部分造成影響
- 可以使得代碼更加清晰易懂,因?yàn)樗袑ο笾g的交互都被集中在中介者對象中進(jìn)行處理.
缺點(diǎn):
- 中介者對象需要處理多個(gè)對象之間的交互,因此其復(fù)雜度可能較高,需要仔細(xì)設(shè)計(jì)和實(shí)現(xiàn).
- 如果設(shè)計(jì)不當(dāng),中介者對象可能會(huì)成為系統(tǒng)的瓶頸,降低系統(tǒng)的性能和響應(yīng)速度.
應(yīng)用場景:
- 當(dāng)多個(gè)對象之間存在復(fù)雜的交互關(guān)系,且彼此之間的耦合度較高時(shí),可以考慮使用中介者模式進(jìn)行重構(gòu).
- 當(dāng)系統(tǒng)中存在大量的對象,而且它們之間的交互關(guān)系錯(cuò)綜復(fù)雜時(shí),可以考慮使用中介者模式進(jìn)行簡化和優(yōu)化.
- 當(dāng)需要再不影響其他部分的情況下擴(kuò)展和修改系統(tǒng)時(shí),可以使用中介者模式來實(shí)現(xiàn)系統(tǒng)的靈活性和可擴(kuò)展性.
到此這篇關(guān)于Java設(shè)計(jì)模式之中介者模式的實(shí)現(xiàn)方式的文章就介紹到這了,更多相關(guān)Java中介者模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis-plus自帶QueryWrapper自定義sql實(shí)現(xiàn)復(fù)雜查詢實(shí)例詳解
MyBatis-Plus是一個(gè)MyBatis(opens new window)的增強(qiáng)工具,在 MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,MyBatis可以無損升級為MyBatis-Plus,這篇文章主要給大家介紹了關(guān)于mybatis-plus自帶QueryWrapper自定義sql實(shí)現(xiàn)復(fù)雜查詢的相關(guān)資料,需要的朋友可以參考下2022-10-10
springboot maven 項(xiàng)目打包jar 最后名稱自定義的教程
這篇文章主要介紹了springboot maven 項(xiàng)目打包jar 最后名稱自定義的教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
淺談SpringCloud的微服務(wù)架構(gòu)組件
這篇文章主要介紹了淺談SpringCloud的微服務(wù)架構(gòu)組件,Spring Cloud根據(jù)分布式服務(wù)協(xié)調(diào)治理的需求成立了許多子項(xiàng)目,每個(gè)項(xiàng)目通過特定的組件去實(shí)現(xiàn),需要的朋友可以參考下2023-04-04
Spring Boot高效數(shù)據(jù)聚合之道深入講解
這篇文章主要給大家介紹了關(guān)于Spring Boot高效數(shù)據(jù)聚合之道的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
spring boot 配置動(dòng)態(tài)刷新詳解
這篇文章主要介紹了spring boot 配置動(dòng)態(tài)刷新實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-09-09

