中介者模式-Mediator Pattern(Java实现)
中介者模式-Mediator Pattern
终结者模式用于各同事角色之间的通信。
本文的例子: 小组中又很多成员, 一个成员做一件事情后会通知给其他成员, 让其他成员采取措施.
但是一个人做了一件事情后, 如果要亲自通知给小组里的所有其他人, 那么就太费劲了, 此时需要一个中介者来完成小组内的通信.
Action枚举
事件的定义.
public enum Action { HUNT("做好了饭", "来吃饭"), TALE("要讲故事", "来听故事"), FOND("发现了鲜花", "来观赏"); private String title; private String description; Action(String title, String description) { this.title = title; this.description = description; } public String getDescription() { return description; } @Override public String toString() { return title; } }
GroupMember接口
小组成员的定义
public interface GroupMember { void joinedParty(Group group); void partyAction(Action action); void act(Action action); }
GroupMemberBase抽象类
小组成员的抽象封装
public abstract class GroupMemberBase implements GroupMember { protected Group group; @Override public void joinedParty(Group group) { System.out.printf("%s 加入到了小组中\n", this); this.group = group; } @Override public void partyAction(Action action) { System.out.printf("%s %s\n", this, action.getDescription()); } @Override public void act(Action action) { if (group != null) { System.out.printf("%s %s\n", this, action); group.act(this, action); } } @Override public abstract String toString(); }
Andersen类
安徒生, 一个会讲故事的男人, 他继承了GroupMemberBase抽象类, 他可以加入到某个小组中.
public class Andersen extends GroupMemberBase { @Override public String toString() { return "安徒生"; } }
Chef类
一名厨师,他也可以加入到某个小组中
public class Chef extends GroupMemberBase { @Override public String toString() { return "厨师"; } }
Fairy类
小精灵, 他也可以加入到某个群组中
public class Fairy extends GroupMemberBase { @Override public String toString() { return "小精灵"; } }
Group接口
中介者的抽象定义
public interface Group { void addMember(GroupMember member); void act(GroupMember actor, Action action); }
GroupMediator类
小组的中介者, 可以添加成员, 也可以做到本文开头中说的"通知给其他人"这件事.
import java.util.ArrayList; import java.util.List; public class GroupMediator implements Group { private final List<GroupMember> members; public GroupMediator() { members = new ArrayList<>(); } @Override public void act(GroupMember actor, Action action) { for (GroupMember member : members) { if (!member.equals(actor)) { member.partyAction(action); } } } @Override public void addMember(GroupMember member) { members.add(member); member.joinedParty(this); } }
Main
public class Main { public static void main(String[] args) { // 创建一个小组 Group party = new GroupMediator(); // 有三种人 Andersen andersen = new Andersen(); Fairy fairy = new Fairy(); Chef chef = new Chef(); // 这三种人都加入到了小组中 party.addMember(andersen); party.addMember(fairy); party.addMember(chef); System.out.println("-------------------"); // 安徒生要讲故事, 中介者就会通知其他人. andersen.act(Action.TALE); System.out.println("-------------------"); // 精灵发现了鲜花, 中介者就会通知其他所有人 fairy.act(Action.FOND); System.out.println("-------------------"); //厨师做好了饭, 中介者就会通知其他所有人 chef.act(Action.HUNT); } }
结果如下:
---------------------------------------------------------
学如不及,犹恐失之
学如不及,犹恐失之