diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 0c6a6d9aa65272656282d7f0f42e19d40aa25fd3..61733465f24cbc8ec2c66dcab98d8de4eb38858f 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -20,6 +20,7 @@ + @@ -29,6 +30,7 @@ + diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 9265d3bb2190c89d7e989a41ec3f29fbf8bb579f..36b1fd06ae1d0b989c8d885bf53ae8a60437d293 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -19,6 +19,8 @@ + + diff --git a/.idea/misc.xml b/.idea/misc.xml index e471b02ee6886ff64384dec4bc0f78edecb861f7..268219865a85f96f5d3b3506625ca1ba43fd2a9e 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,6 +22,7 @@ diff --git a/README.md b/README.md index a8f22d0dd7daf2012c845327da3359de412d535f..48e77ea65c4e4aed1f60ba8f87d96bd6e6660d5f 100644 --- a/README.md +++ b/README.md @@ -443,6 +443,40 @@ value ::= integer - 当问题重复出现,且可以用一种简单的语言来进行表达 - 当一个语言需要解释执行,并且语言中的句子可以表示为一个抽象的语法树的时候 +# 中介者模式 +### 中介者模式介绍 + +提到中介模式,有一个比较经典的例子就是航空管制。 为了让飞机在飞行的时候互不干扰,每架飞机都需要知道其他飞机每时每刻的位置,这就需要时刻跟其他飞机通信。飞机通信形成的通信网络就会无比复杂。这个时候,我们通过引 入“塔台”这样一个中介,让每架飞机只跟塔台来通信,发送自己的位置给塔台,由塔台来 负责每架飞机的航线调度。这样就大大简化了通信网络。 + +![img.png](img/img_mediator_pattern_introduce.png) + +**中介模式(mediator pattern)的定义: 定义一个单独的(中介)对象,来封装一组对象之间的交互,将这组对象之间的交互委派给予中介对象交互,来避免对象之间的交互.** + +中介者对象就是用于处理对象与对象之间的直接交互,封装了多个对象之间的交互细节。中介模式的设计跟中间层很像,通过引入中介这个中间层,将一组对象之间的交互关系从多对多的网状关系转换为一对多的星状关系.原来一个对象要跟N个对象交互,现在只需要跟一个中介对象交互,从而最小化对象之间的交互关系,降低代码的复杂度,提高代码的可读性和可维护性. + +## 原理图 +![img.png](img/img_mediator_pattern_principle.png) +## 优缺点 +**1) 中介者模式的优点** + +- 中介者模式简化了对象之间的交互,他用中介者和同事的一对多代替了原来的同事之间的多对多的交互,一对多关系更好理解 易于维护和扩展,将原本难以理解的网状结构转换成习相对简单的星型结构. +- 可以将各个同事就对象进行解耦.中介者有利于各个同事之间的松耦合,可以独立的改变或者复用每一个同事或者中介者,增加新的中介者类和新的同事类都比较方便,更符合开闭原则 +- 可以减少子类生成,中介者将原本分布与多个对象的行为集中在了一起,改变这些行为只需要生成新的中介者的子类即可,使得同事类可以被重用,无需直接对同事类进行扩展. + +**2) 中介者模式的缺点** + +- 在具体中介者类中包含了大量同事之间的交互细节,可能会导致中介者类变得非常的复杂,使得系统不好维护. + +**3) 中介者模式使用场景** + +- 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解. +- 一个对象由于引用了其他的很多对象并且直接和这些对象进行通信,导致难以复用该对象. +- 想要通过一个中间类来封装多个类中的行为,而又不想生成太多的子类,此时可以通过引用中介者类来实现,在中介者类中定义对象的交互的公共行为,如果需要改变行为则可以在增加新的中介类. + + + + + 1. 使用 Readme.md 来支持不同的语言, Readme\_en.md: 支持英文, Readme\_zh.md: 支持中文 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 小的进步,才是大的开始!!! diff --git a/byv-mediator-patttern-22/.gitignore b/byv-mediator-patttern-22/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..5ff6309b7199129c1afe4f4ec1906e640bec48c6 --- /dev/null +++ b/byv-mediator-patttern-22/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/byv-mediator-patttern-22/pom.xml b/byv-mediator-patttern-22/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..bb4f8d9422e7b1f1c966406f7bde0e7528bcb641 --- /dev/null +++ b/byv-mediator-patttern-22/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + org.example + byv-mediator-patttern-22 + 1.0-SNAPSHOT + + + 8 + 8 + UTF-8 + + + + + org.projectlombok + lombok + 1.18.28 + compile + + + org.dom4j + dom4j + 2.1.3 + + + jaxen + jaxen + 1.1.6 + + + log4j + log4j + 1.2.12 + + + org.slf4j + slf4j-api + 1.7.36 + + + com.alibaba + fastjson + 1.2.62 + + + junit + junit + 4.12 + compile + + + + + \ No newline at end of file diff --git a/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/Cliient.java b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/Cliient.java new file mode 100644 index 0000000000000000000000000000000000000000..8be0a101e9793b47053a78a93cfa2a2039065276 --- /dev/null +++ b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/Cliient.java @@ -0,0 +1,20 @@ +package com.boyunv.mediator.example01; +/* + *@description + * + *@author boyunv + *@create 2023/9/10 9:38 + *@version 1.0 + */ + +public class Cliient { + + public static void main(String[] args) { + //创建中介者 + MediatorImpl mediator = new MediatorImpl(); + ConcreteColleagueA concreteColleagueA = new ConcreteColleagueA(mediator); + concreteColleagueA.exec("Key-A"); + ConcreteColleagueA concreteColleagueB = new ConcreteColleagueA(mediator); + concreteColleagueB.exec("Key-B"); + } +} diff --git a/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/Colleague.java b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/Colleague.java new file mode 100644 index 0000000000000000000000000000000000000000..0d2d1283eaecbb0bdfba3f624d40a9b1f5f6b894 --- /dev/null +++ b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/Colleague.java @@ -0,0 +1,22 @@ +package com.boyunv.mediator.example01; +/* + *@description + * 抽象同事类 + *@author boyunv + *@create 2023/9/10 9:33 + *@version 1.0 + */ + +import lombok.Getter; + +public abstract class Colleague { + @Getter + private Mediator mediator; + + public Colleague(Mediator mediator) { + this.mediator = mediator; + } + + //同事件进行交互的方法 + public abstract void exec(String key); +} diff --git a/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/ConcreteColleagueA.java b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/ConcreteColleagueA.java new file mode 100644 index 0000000000000000000000000000000000000000..b100fb00d771dc91dd14c6176706fe384d8c72de --- /dev/null +++ b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/ConcreteColleagueA.java @@ -0,0 +1,22 @@ +package com.boyunv.mediator.example01; +/* + *@description + * 具体同事类 + *@author boyunv + *@create 2023/9/10 9:35 + *@version 1.0 + */ + +public class ConcreteColleagueA extends Colleague{ + public ConcreteColleagueA(Mediator mediator) { + super(mediator); + } + + @Override + public void exec(String key) { + System.out.println( + " 在A同事中进行中介者执行" + ); + getMediator().apply(key); + } +} diff --git a/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/ConcreteColleagueB.java b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/ConcreteColleagueB.java new file mode 100644 index 0000000000000000000000000000000000000000..e1d902f7e0d4e9d396668794ffacbf826c43f04b --- /dev/null +++ b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/ConcreteColleagueB.java @@ -0,0 +1,22 @@ +package com.boyunv.mediator.example01; +/* + *@description + * 具体同事类 + *@author boyunv + *@create 2023/9/10 9:35 + *@version 1.0 + */ + +public class ConcreteColleagueB extends Colleague{ + public ConcreteColleagueB(Mediator mediator) { + super(mediator); + } + + @Override + public void exec(String key) { + System.out.println( + " 在B同事中进行中介者执行" + ); + getMediator().apply(key); + } +} diff --git a/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/Mediator.java b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/Mediator.java new file mode 100644 index 0000000000000000000000000000000000000000..358a02175c97122e727cf9a02c1d72874d0515dd --- /dev/null +++ b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/Mediator.java @@ -0,0 +1,14 @@ +package com.boyunv.mediator.example01; +/* + *@description + * 抽象中介者 + *@author boyunv + *@create 2023/9/10 9:30 + *@version 1.0 + */ + +public interface Mediator { + + //处理同事对象的主策和转发同事信息的方法 + void apply(String key); +} diff --git a/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/MediatorImpl.java b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/MediatorImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..31c66f07a8af3eec51b69081b1916d93b5bf2df0 --- /dev/null +++ b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/MediatorImpl.java @@ -0,0 +1,16 @@ +package com.boyunv.mediator.example01; +/* + *@description + * 具体中介者 + *@author boyunv + *@create 2023/9/10 9:31 + *@version 1.0 + */ + +public class MediatorImpl implements Mediator{ + @Override + public void apply(String key) { + System.out.println("最终中介者执行的操作,Key为:"+key); + + } +} diff --git a/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/Client.java b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/Client.java new file mode 100644 index 0000000000000000000000000000000000000000..4875e79820b7dbe861a994fed7d24b3534322828 --- /dev/null +++ b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/Client.java @@ -0,0 +1,33 @@ +package com.boyunv.mediator.example01.example02; +/* + *@description + * + *@author boyunv + *@create 2023/9/10 10:13 + *@version 1.0 + */ + +public class Client { + + public static void main(String[] args) { + //中介机构 + MediatorStructure mediator = new MediatorStructure(); + //房主 + HouseOwner yunbuV = new HouseOwner("yunbuV", mediator); + + //租房者 + Tenant aristo = new Tenant("aristo", mediator); + //中介收集房主和租房者的信息 + mediator.setHouseOwner(yunbuV); + mediator.setTenant(aristo); + + //租房人的需求 + aristo.contact("需要在复旦一个研究生宿舍,6000"); + + //房主需求 + yunbuV.contact("拿出复旦录取通知书就行"); + + + + } +} diff --git a/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/HouseOwner.java b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/HouseOwner.java new file mode 100644 index 0000000000000000000000000000000000000000..121ffbf9fa687d356c52e0b1db5744d9798d8cdd --- /dev/null +++ b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/HouseOwner.java @@ -0,0 +1,26 @@ +package com.boyunv.mediator.example01.example02; +/* + *@description + * + *@author boyunv + *@create 2023/9/10 10:03 + *@version 1.0 + */ + +public class HouseOwner extends Person{ + + public HouseOwner(String name, Mediator mediator) { + super(name, mediator); + } + + //与中介联系的方法 + public void contact (String message){ + mediator.constact(message,this); + } + + //获取信息大方法 + public void getMessage(String message){ + System.out.println("房主:"+ name+",获取到的信息:"+message); + } + +} diff --git a/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/Mediator.java b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/Mediator.java new file mode 100644 index 0000000000000000000000000000000000000000..349aacf663f160426dbd2aa4b64a3394ef2f4730 --- /dev/null +++ b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/Mediator.java @@ -0,0 +1,13 @@ +package com.boyunv.mediator.example01.example02; +/* + *@description + * 抽象中介者模式 + *@author boyunv + *@create 2023/9/10 9:58 + *@version 1.0 + */ + +public abstract class Mediator { + //c创建联络方法 + public abstract void constact(String message ,Person person); +} diff --git a/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/MediatorStructure.java b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/MediatorStructure.java new file mode 100644 index 0000000000000000000000000000000000000000..0348d01008438f1f033822c8335f017f70c36f97 --- /dev/null +++ b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/MediatorStructure.java @@ -0,0 +1,31 @@ +package com.boyunv.mediator.example01.example02; + +import lombok.Data; + +/* + *@description + * Juin中介者 一个中介机构 + *@author boyunv + *@create 2023/9/10 10:09 + *@version 1.0 + */ +@Data +public class MediatorStructure extends Mediator{ + + //中介知晓房租出租人和承租人的信息 + private HouseOwner houseOwner; //房主 + + private Tenant tenant;//租房 + + + @Override + public void constact(String message, Person person) { + if(person==houseOwner){ + //如果是房主,则租房者获得信息 + tenant.getMsg(message); + }else { + //如果租房者是则房主获得信息 + houseOwner.getMessage(message); + } + } +} diff --git a/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/Person.java b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/Person.java new file mode 100644 index 0000000000000000000000000000000000000000..2ca7768968739599bf2aa8003a57c2defae34613 --- /dev/null +++ b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/Person.java @@ -0,0 +1,21 @@ +package com.boyunv.mediator.example01.example02; +/* + *@description + *抽象同事类 + *@author boyunv + *@create 2023/9/10 10:00 + *@version 1.0 + */ + +public abstract class Person { + + protected String name; + + //持有中介者的引用 + protected Mediator mediator; + + public Person(String name, Mediator mediator) { + this.name = name; + this.mediator = mediator; + } +} diff --git a/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/Tenant.java b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/Tenant.java new file mode 100644 index 0000000000000000000000000000000000000000..07824a256e5697e8b625a07d6b2779ed8fa4e11d --- /dev/null +++ b/byv-mediator-patttern-22/src/main/java/com/boyunv/mediator/example01/example02/Tenant.java @@ -0,0 +1,24 @@ +package com.boyunv.mediator.example01.example02; +/* + *@description + * 租房者 + *@author boyunv + *@create 2023/9/10 10:06 + *@version 1.0 + */ + +public class Tenant extends Person{ + public Tenant(String name, Mediator mediator) { + super(name, mediator); + + } + + public void contact(String message){ + mediator.constact(message,this); + } + + public void getMsg(String msg){ + System.out.println("租房者"+name+",获取到的信息:"+msg); + } + +} diff --git a/byv-mediator-patttern-22/src/main/resources/config.xml b/byv-mediator-patttern-22/src/main/resources/config.xml new file mode 100644 index 0000000000000000000000000000000000000000..7cbe016568f295adf6621d9d76f83604173b20e5 --- /dev/null +++ b/byv-mediator-patttern-22/src/main/resources/config.xml @@ -0,0 +1,4 @@ + + + com.boyunv.strategy.example03.MT1101HandlerStrategy + \ No newline at end of file diff --git a/img/img_mediator_pattern_introduce.png b/img/img_mediator_pattern_introduce.png new file mode 100644 index 0000000000000000000000000000000000000000..5af84a322b4137fe9b5672ce2c22332155c833f3 Binary files /dev/null and b/img/img_mediator_pattern_introduce.png differ diff --git a/img/img_mediator_pattern_principle.png b/img/img_mediator_pattern_principle.png new file mode 100644 index 0000000000000000000000000000000000000000..409ddd00a9790d697b9ad9765bc383bb374b00b5 Binary files /dev/null and b/img/img_mediator_pattern_principle.png differ