抱怨一下
當初為什麼要選這個設計模式當最後一組題目呢
從早上十二點寫到早上五點半是不用睡覺了嗎
模式從這三個組成
瞭解後這個設計模式滿好玩的
用實例來說比較好理解,功能需求如下:
public interface Mediator {
    String send(String name, String message, Caller sendTo);
    String sendAllStore(String name, String message);
}
public abstract class Caller {
    private final String name;
    private static final Mediator mediator = new CallerMediator();
    public Caller(String name) {
        this.name = name;
    }
    public String send(String message, Caller caller) {
        String send;
        send = mediator.send(this.name, message, caller);
        return send;
    }
    public String sendAllStore(String message) {
        String sendAllStore;
        sendAllStore = mediator.sendAllStore(this.name, message);
        return sendAllStore;
    }
    public String getName() {
        return name;
    }
}
public class CallerMediator implements Mediator {
    public static final String MANAGER = "Manager";
    public static final String STAFF = "Staff";
    private static final List<Manager> managerList = new ArrayList<>();
    private static final List<Staff> staffList = new ArrayList<>();
    public String addCaller(Caller caller) {
        String text;
        if (MANAGER.equals(caller.getClass().getSimpleName())) {
            managerList.add((Manager) caller);
            text = "加入管理級廣播群組:" + caller.getName();
        } else if (STAFF.equals(caller.getClass().getSimpleName())) {
            staffList.add((Staff) caller);
            text = "加入員工級訊息群組:" + caller.getName();
        } else {
            text = "不加入聊天群組:" + caller.getName();
        }
        return text;
    }
    @Override
    public String send(String name, String message, Caller sendTo) {
        StringBuilder text;
        text = new StringBuilder();
        text.append(name);
        text.append(" ");
        text.append("發送訊息給 ");
        for (Caller caller : managerList) {
            if (caller.getName().equals(name)) {
                text.append(sendTo.getName());
            }
        }
        for (Caller caller : staffList) {
            if (caller.getName().equals(name)) {
                text.append(sendTo.getName());
            }
        }
        text.append(" | ");
        text.append("訊息內容:");
        text.append(message);
        return text.toString();
    }
    @Override
    public String sendAllStore(String name, String message) {
        StringBuilder text;
        text = new StringBuilder();
        text.append(name);
        text.append(" ");
        text.append("發送全體廣播:");
        text.append(message);
        text.append("\n");
        text.append("接收者:");
        for (Caller caller : managerList) {
            if (!caller.getName().equals(name)) {
                text.append(caller.getName());
                text.append("、");
            }
        }
        for (Caller caller : staffList) {
            if (!caller.getName().equals(name)) {
                text.append(caller.getName());
                text.append("、");
            }
        }
        return text.toString();
    }
}
public class Manager extends Caller {
    public Manager(String name) {
        super(name);
    }
}
public class Staff extends Caller {
    public Staff(String name) {
        super(name);
    }
    @Override
    public String sendAllStore(String message) {
        StringBuilder text;
        text = new StringBuilder();
        text.append(getName());
        text.append(" 無法使用全體廣播");
        return text.toString();
    }
}
public class JavaTest {
    @Test
    public void show() {
        StringBuilder text;
        text = new StringBuilder();
        text.append("\n");
        Caller mall = new Manager("商場");
        Caller carrefour = new Staff("家樂福");
        Caller familyMark = new Staff("全家");
        CallerMediator callerMediator = new CallerMediator();
        text.append(callerMediator.addCaller(mall));
        text.append("\n");
        text.append(callerMediator.addCaller(carrefour));
        text.append("\n");
        text.append(callerMediator.addCaller(familyMark));
        text.append("\n");
        text.append("\n");
        text.append(mall.sendAllStore("現在飲料買一送五"));
        text.append("\n");
        text.append("\n");
        text.append(mall.send("現在麵包買二送一,賣完了自己想辦法生出麵包", carrefour));
        text.append("\n");
        text.append(mall.send("現在便當打七折,賣完了自己想辦法生出便當", familyMark));
        text.append("\n");
        text.append(carrefour.send("借我一個員工支援收銀", familyMark));
        text.append("\n");
        text.append(familyMark.send("借你一個員工時薪 2000 元", carrefour));
        text.append("\n");
        text.append("\n");
        text.append(carrefour.sendAllStore("我不賣麵包啦,商場"));
        text.append("\n");
        text.append(familyMark.sendAllStore("我不賣便當啦,商場"));
        text.append("\n");
        assertEquals("測試", text.toString());
    }
}
加入管理級廣播群組:商場
加入員工級訊息群組:家樂福
加入員工級訊息群組:全家
商場 發送全體廣播:現在飲料買一送五
接收者:家樂福、全家、
商場 發送訊息給 家樂福 | 訊息內容:現在麵包買二送一,賣完了自己想辦法生出麵包
商場 發送訊息給 全家 | 訊息內容:現在便當打七折,賣完了自己想辦法生出便當
家樂福 發送訊息給 全家 | 訊息內容:借我一個員工支援收銀
全家 發送訊息給 家樂福 | 訊息內容:借你一個員工時薪 2000 元
家樂福 無法使用全體廣播
全家 無法使用全體廣播