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

 结果如下:

 

posted @ 2018-05-21 02:27  GoldArowana  阅读(457)  评论(0编辑  收藏  举报