2012-02-13 4 views
0

Я прочитал, что чат является образцом использования шаблона посредника. Я написал простое подражание чату, но я не знаю, как я могу использовать шаблон медиатора в этой ситуации. Как я понимаю, у моего объекта уже есть свободная связь, а класс Server похож на 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 ничего не знает о других. В большинстве случаев этот параметр используется для пользовательского интерфейса. В вашем случае, поскольку у вас есть только 1 тип ChatClient и один тип сервера, observer:

+0

У меня есть 3 разных клиента и один сервер, через которые клиенты общаются друг с другом. Я обновляю свой пост. Пожалуйста, посмотрите вывод. – drifter

+0

Они такие же, я говорю о различной реализации интерфейса, а не о экземплярах класса – Anton

+0

Хорошо, извините. Можете ли вы сказать, как мне нужно изменить условия выборки, чтобы использовать шаблон посредника? – drifter

Смежные вопросы