2012-02-13 5 views
0

私はチャットがMediatorパターンの使用のサンプルであることを読みました。私はチャットの簡単な模倣を書いたが、私はこの状況でどのようにメディエーターのパターンを使うことができるのか分からない。 私のすべてのオブジェクトはすでに緩いカップリングを持っていると理解しています。サーバークラスはMediatorに似ています。 サンプルにMediatorパターンを使用して私を見せてもらえますか?Mediatorパターンの例:チャット

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.List; 
import java.util.Observable; 
import java.util.Observer; 
import java.util.Random; 
import java.util.Timer; 
import java.util.TimerTask; 

public class Main1 { 

    public static void main(String[] args) { 
     final Server chatObserver = new Server(); 
     chatObserver.addObserver(new Client("User1", chatObserver)); 

     Timer t = new Timer(); 
     t.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       chatObserver.addObserver(new Client("User2", chatObserver)); 
      } 
     }, 5); 
     t.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       chatObserver.addObserver(new Client("User3", chatObserver)); 
      } 
     }, 10); 
    } 

    static class Client extends Observable implements Observer { 
     private String name; 
     private List<Message> chatHistoryToDisplay; 
     private Timer timer = new Timer(); 
     private Random random = new Random(); 

     public Client(final String name, Observer o) { 
      this.name = name; 
      addObserver(o);   
      chatHistoryToDisplay = new ArrayList<Message>(((Server) o).getChatHistory()); 
      timer.scheduleAtFixedRate(new TimerTask() { 
       @Override 
       public void run() { 
        int msg = random.nextInt(10); 
        String str = name + " writed " + msg; 
        System.out.println("\t"+str); 
        setChanged(); 
        notifyObservers(new Message(name,String.valueOf(msg))); 
       } 
      }, 0, 10000); 
     } 

     @Override 
     public void update(Observable o, Object msg) { 
       chatHistoryToDisplay.add((Message) msg); 
       System.out.println("----------- "+name+" screen -----------"); 
       for (int i=0;i<chatHistoryToDisplay.size();i++) { 
        Message m = chatHistoryToDisplay.get(i); 
        System.out.println(m.toString()); 
       } 
     } 
    } 

    static class Server extends Observable implements Observer { 
     private List<Message> chatHistory = new ArrayList<Message>(); 

     @Override 
     public void update(Observable arg0, Object msg) { 
      chatHistory.add((Message) msg); 
      setChanged(); 
      notifyObservers(msg); 
     } 

     public Collection<Message> getChatHistory(){ 
      return chatHistory; 
     } 
    } 


    static class Message { 
     private String author; 
     private String message; 

     public Message(String author, String message) { 
      this.author = author; 
      this.message = message; 
     } 

     @Override 
     public String toString() { 
      return author + ": " + message; 
     } 
    } 
} 

CONSOLE:

User1 writed 3 
----------- User1 screen ----------- 
User1: 3 
    User2 writed 9 
----------- User2 screen ----------- 
User1: 3 
User2: 9 
----------- User1 screen ----------- 
User1: 3 
User2: 9 
    User3 writed 9 
----------- User3 screen ----------- 
User1: 3 
User2: 9 
User3: 9 
----------- User2 screen ----------- 
User1: 3 
User2: 9 
User3: 9 
----------- User1 screen ----------- 
User1: 3 
User2: 9 
User3: 9 

のように...

答えて

1

わからない、正しくあなたの質問を理解しています。

しかし、私は、このケースでは、あなたが実際にmediatorパターンを必要としないと思います。いくつかのデータを交換する必要があるオブジェクトがたくさんあるだけであれば。たとえば、ChatClient1実装、ChatClient2実装など。彼らはmediatorに自分自身を登録し、mediatorにコマンドを送信する必要があります。調停者は他の登録されたクラスについてすべてを知っていますが、すべてChatClientは他のクラスについて何も知らない。ほとんどの場合、このパターンはUI用に使用されています。 あなたのチャットクライアントタイプとサーバタイプは1種類しかないので、observerは となります。

+0

私は3つのクライアントと1つのサーバがどのクライアントが互いに通信しているのかを知っています。私は自分の投稿を更新します。出力を見てください。 – drifter

+0

彼らが同じで、私はいないクラス – Anton

+0

のインスタンスについて、インタフェースの異なる実装について話して[OK]を、Sorry.Can私はMediatorパターンを使用するサンプルの条件を変更する必要がどのように言うの? – drifter

関連する問題