中介者模式, 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);
}
}
結果如下:
---------------------------------------------------------
學如不及,猶恐失之