终结者模式用于各同事角色之间的通信。
本文的例子: 小组中又很多成员, 一个成员做一件事情后会通知给其他成员, 让其他成员采取措施.
但是一个人做了一件事情后, 如果要亲自通知给小组里的所有其他人, 那么就太费劲了, 此时需要一个中介者来完成小组内的通信.
事件的定义.
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; } }
小组成员的定义
public interface GroupMember { void joinedParty(Group group); void partyAction(Action action); void act(Action action); }
小组成员的抽象封装
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(); }
安徒生, 一个会讲故事的男人, 他继承了GroupMemberBase抽象类, 他可以加入到某个小组中.
public class Andersen extends GroupMemberBase { @Override public String toString() { return "安徒生"; } }
一名厨师,他也可以加入到某个小组中
public class Chef extends GroupMemberBase { @Override public String toString() { return "厨师"; } }
小精灵, 他也可以加入到某个群组中
public class Fairy extends GroupMemberBase { @Override public String toString() { return "小精灵"; } }
中介者的抽象定义
public interface Group { void addMember(GroupMember member); void act(GroupMember actor, Action action); }
小组的中介者, 可以添加成员, 也可以做到本文开头中说的"通知给其他人"这件事.
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); } }
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); } }
结果如下:
如对本文有疑问, 点击进行留言回复!!
关于在IDEA中SpringBoot项目中activiti工作流的使用详解
视频编辑工具ACDSee Luxea Video Editor安装及激活图文教程
java spring整合junit操作(有详细的分析过程)
网友评论