天天看點

中介者模式-Mediator Pattern(Java實作)

中介者模式, 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);
    }
}
      

 結果如下:

中介者模式-Mediator Pattern(Java實作)

---------------------------------------------------------

學如不及,猶恐失之