diff --git a/README/images/设计模式-v2/image-20250204184241160.png b/README/images/设计模式-v2/image-20250204184241160.png new file mode 100644 index 0000000..39ad246 Binary files /dev/null and b/README/images/设计模式-v2/image-20250204184241160.png differ diff --git a/README/设计模式-v2.md b/README/设计模式-v2.md index 5fe51fa..0b96b32 100644 --- a/README/设计模式-v2.md +++ b/README/设计模式-v2.md @@ -2328,7 +2328,145 @@ public class Memo { ## 中介者模式---行为型 ---- +![image-20250204184241160](./images/设计模式-v2/image-20250204184241160.png) + +需要角色:抽象中介者、具体中介者、抽象同事类、具体同事类 + +### 简单示例 + +#### 代码示例 + +```java +public class Behavior { + public static void main(String[] args) { + // 创建邮局 + PostOfficeImpl postOffice = new PostOfficeImpl(); + + // 创建收信人和接收人 + Me me = new Me(postOffice, "在地球南边"); + You you = new You(postOffice, "在地球北边"); + + // 到邮局建立联系 + postOffice.addPeople(me); + postOffice.addPeople(you); + + // 我: + me.sendLetter("我的消息", "You"); + System.out.println("---------------分隔线---------------"); + + // 你: + you.sendLetter("你的回信", "You"); + System.out.println("---------------分隔线---------------"); + + // 我: + me.sendLetter("哈哈哈哈哈哈哈哈哈", "You"); + } + + // 抽象中介者 + interface PostOffice { + + /** + * 送信 + */ + void deliverLetter(String letter, String receiver); + + /** + * 添加人 + */ + void addPeople(People people); + } + + @Data + static class PostOfficeImpl implements PostOffice { + private final Map peopleMap = new HashMap<>(); + + /** + * 送信 + */ + @Override + public void deliverLetter(String letter, String receiver) { + System.out.println("=>收信:邮局收到要寄的信"); + + People people = peopleMap.get(receiver); + + System.out.println("=>送信:拿出地址查询收件人地址是:" + people.getAddress() + ",送信"); + System.out.println("=>收信人看信:"); + + people.receiveLetter(letter); + } + + /** + * 添加人 + */ + @Override + public void addPeople(People people) { + peopleMap.put(people.getClass().getSimpleName(), people); + } + } + + + @Getter + static class People { + private final String address; + protected PostOffice postOffice; + + public People(PostOffice postOffice, String address) { + this.postOffice = postOffice; + this.address = address; + } + + /** + * 收到信 + * + * @param letter 信的内容 + */ + public void receiveLetter(String letter) { + System.out.println(letter); + } + + /** + * 发送信 + * + * @param letter 信内容 + * @param receiver 收件人 + */ + public void sendLetter(String letter, String receiver) { + postOffice.deliverLetter(letter, receiver); + } + } + + static class Me extends People { + public Me(PostOffice postOffice, String address) { + super(postOffice, address); + } + } + + static class You extends People { + public You(PostOffice postOffice, String address) { + super(postOffice, address); + } + } +} +``` + +#### 运行结果: + +```java +=>收信:邮局收到要寄的信 +=>送信:拿出地址查询收件人地址是:在地球北边,送信 +=>收信人看信: +我的消息 +---------------分隔线--------------- +=>收信:邮局收到要寄的信 +=>送信:拿出地址查询收件人地址是:在地球北边,送信 +=>收信人看信: +你的回信 +---------------分隔线--------------- +=>收信:邮局收到要寄的信 +=>送信:拿出地址查询收件人地址是:在地球北边,送信 +=>收信人看信: +哈哈哈哈哈哈哈哈哈 +``` ## 迭代器模式---行为型 diff --git a/pattern/src/main/java/cn/bunny/pattern16/Behavior.java b/pattern/src/main/java/cn/bunny/pattern16/Behavior.java new file mode 100644 index 0000000..b3d892e --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern16/Behavior.java @@ -0,0 +1,118 @@ +package cn.bunny.pattern16; + +import lombok.Data; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +public class Behavior { + public static void main(String[] args) { + // 创建邮局 + PostOfficeImpl postOffice = new PostOfficeImpl(); + + // 创建收信人和接收人 + Me me = new Me(postOffice, "在地球南边"); + You you = new You(postOffice, "在地球北边"); + + // 到邮局建立联系 + postOffice.addPeople(me); + postOffice.addPeople(you); + + // 我: + me.sendLetter("我的消息", "You"); + System.out.println("---------------分隔线---------------"); + + // 你: + you.sendLetter("你的回信", "You"); + System.out.println("---------------分隔线---------------"); + + // 我: + me.sendLetter("哈哈哈哈哈哈哈哈哈", "You"); + } + + // 抽象中介者 + interface PostOffice { + + /** + * 送信 + */ + void deliverLetter(String letter, String receiver); + + /** + * 添加人 + */ + void addPeople(People people); + } + + @Data + static class PostOfficeImpl implements PostOffice { + private final Map peopleMap = new HashMap<>(); + + /** + * 送信 + */ + @Override + public void deliverLetter(String letter, String receiver) { + System.out.println("=>收信:邮局收到要寄的信"); + + People people = peopleMap.get(receiver); + + System.out.println("=>送信:拿出地址查询收件人地址是:" + people.getAddress() + ",送信"); + System.out.println("=>收信人看信:"); + + people.receiveLetter(letter); + } + + /** + * 添加人 + */ + @Override + public void addPeople(People people) { + peopleMap.put(people.getClass().getSimpleName(), people); + } + } + + + @Getter + static class People { + private final String address; + protected PostOffice postOffice; + + public People(PostOffice postOffice, String address) { + this.postOffice = postOffice; + this.address = address; + } + + /** + * 收到信 + * + * @param letter 信的内容 + */ + public void receiveLetter(String letter) { + System.out.println(letter); + } + + /** + * 发送信 + * + * @param letter 信内容 + * @param receiver 收件人 + */ + public void sendLetter(String letter, String receiver) { + postOffice.deliverLetter(letter, receiver); + } + } + + static class Me extends People { + public Me(PostOffice postOffice, String address) { + super(postOffice, address); + } + } + + static class You extends People { + public You(PostOffice postOffice, String address) { + super(postOffice, address); + } + } +}