中介者模式, 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); } }
結果如下: