2019年5月13日 星期一

7天學會設計模式 CHAP20 中介者模式 Mediator

7天學會設計模式
http://www.books.com.tw/products/0010750585

chap20.
中介者模式 Mediator
目的:當有多個物件之間有交互作用,使用一個中介物件來負責這些物件的交互以降低這些物件之間的耦合
package com.ssc24.chap20.demo01;
public abstract class Messager {
 private String name;
 private static Mediator mediator = new MessageMediator();
 public Messager(String name) {
  this.name = name;
 }
 public void sendToAll(String message) {
  mediator.sendToAll(name, message);
 }
 public void send(String message,Messager to) {
  mediator.send(message, this.name, to);
 }
 public String getName() {
  return this.name;
 }
}

package com.ssc24.chap20.demo01;
public class VIPUser extends Messager {
 public VIPUser(String name) {
  super(name);
 }
}

package com.ssc24.chap20.demo01;
public class CommonUser extends Messager {
 public CommonUser(String name) {
  super(name);
 }
 public void sendToAll(String message) {
  System.out.println("非VIP用戶不能使用廣播");
 }
}

package com.ssc24.chap20.demo01;
public interface Mediator {
 void send(String message,String from,Messager to);
 void sendToAll(String from,String message);
}

package com.ssc24.chap20.demo01;
import java.util.ArrayList;
import java.util.List;
public class MessageMediator implements Mediator {
 private static List<VIPUser> vipList = new ArrayList<VIPUser>();
 private static List<CommonUser> userList = new ArrayList<CommonUser>();
 public static void joinChat(Messager messager) {
  if ("VIPUser".equals(messager.getClass().getSimpleName())) {
   vipList.add((VIPUser)messager);
  } else {
   userList.add((CommonUser)messager);
  }
 }
 @Override
 public void send(String message, String from, Messager to) {
  for (Messager msg : vipList) {
   if (from.equals(msg.getName())) {
    System.out.println(from + " -> " + to.getName() + " :" + message);
   }
  }
  for (Messager msg : userList) {
   if (from.equals(msg.getName())) {
    System.out.println(from + " -> " + to.getName() + " :" + message);
   }
  }
 }
 @Override
 public void sendToAll(String from, String message) {
  for (Messager msg : vipList) {
   if (from.equals(msg.getName())) {
    System.out.println(from + " -> " + msg.getName() + " :" + message);
   }
  }
  for (Messager msg : userList) {
   if (from.equals(msg.getName())) {
    System.out.println(from + " -> " + msg.getName() + " :" + message);
   }
  }
 }
}

package com.ssc24.chap20.demo01;
import static org.junit.Assert.*;
import org.junit.Test;
public class MediatorTest {
 @Test
 public void test() {
  System.out.println("===中介者模式===");
  Messager jacky = new VIPUser("jacky");
  Messager huant = new CommonUser("huant");
  Messager neil = new CommonUser("neil");
  MessageMediator.joinChat(jacky);
  MessageMediator.joinChat(huant);
  MessageMediator.joinChat(neil);
  System.out.println("---VIP會員直接送訊息給每個人---");
  jacky.sendToAll("hi, 你好");
  System.out.println("---私底下送訊息---");
  jacky.send("單挑阿!PK阿", huant);
  neil.send("收假了!!掰掰", jacky);
  System.out.println("---當VIP會員想送訊息給每個人---");
  neil.sendToAll("阿阿阿");
 }
}

/**
===中介者模式===
---VIP會員直接送訊息給每個人---
jacky -> jacky :hi, 你好
---私底下送訊息---
jacky -> huant :單挑阿!PK阿
neil -> jacky :收假了!!掰掰
---當VIP會員想送訊息給每個人---
非VIP用戶不能使用廣播
**/