Proxy pattern diagram, Archive

Dans l'exemple ci-dessous, la classe Publisher aurait pu être intégrée dans PubSubServer.

Message.java
package com.llgc.publisher;
 
public class Message {
  private String payLoad;
  private String topic;
 
  public String getPayLoad() {
    return payLoad;
  }
 
  public String getTopic() {
    return topic;
  }
 
  public Message(String topic, String payLoad) {
    super();
    this.topic = topic;
    this.payLoad = payLoad;
  }
}
Subscriber.java
package com.llgc.publisher;
 
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
 
public class Subscriber {
  private Queue<String> topics;
  private Queue<Message> myMessages;
 
  public Subscriber() {
    topics = new LinkedList<String>();
    myMessages = new LinkedList<Message>();
  }
 
   public void listen(String newTopic) {
    topics.add(newTopic);
  }
 
  public void print() {
    while (!myMessages.isEmpty()) {
      Message newMessage = myMessages.poll();
      System.out.println("Topic : " + newMessage.getTopic() + System.lineSeparator() + newMessage.getPayLoad());
    }
  }
 
  public Collection<String> getTopics() {
    return Collections.unmodifiableCollection(topics);
  }
 
  public void addMessage(Message message) {
    myMessages.add(message);
  }
}
PubSubServer.java
package com.llgc.publisher;
 
import java.util.LinkedList;
import java.util.Queue;
 
public class PubSubServer {
  private Queue<Message> buffer;
  private Queue<Subscriber> subscribers;
 
  public PubSubServer() {
    buffer = new LinkedList<Message>();
    subscribers = new LinkedList<Subscriber>();
  }
 
  public void forward() {
    while (!buffer.isEmpty()) {
      Message tempMessage = buffer.poll();
      for (Subscriber subscriber : subscribers) {
        for (String topic : subscriber.getTopics()) {
          if (tempMessage.getTopic().equals(topic)) {
            subscriber.addMessage(tempMessage);
          }
        }
      }
    }
  }
 
  public void addSubscriber(Subscriber sub) {
    subscribers.add(sub);
  }
 
  public void addBuffer(Message message) {
    buffer.add(message);
  }
}
Publisher.java
package com.llgc.publisher;
 
public class Publisher {
  public void send(Message newMessage, PubSubServer myServer) {
    myServer.addBuffer(newMessage);
  }
}
Main.java
package com.llgc.publisher;
 
public class Main {
 
  public static void main(String[] args) {
    Publisher publisher = new Publisher();
 
    Subscriber animalLover = new Subscriber();
    Subscriber oldCatLady = new Subscriber();
 
    PubSubServer server = new PubSubServer();
 
    Message dogMessage = new Message("Dogs", "Dogs are man's best friend");
    Message catMessage = new Message("Cats", "Cats can take care of themselves");
 
    // le publieur envoie un message qui sera conservé sur le serveur.
    publisher.send(dogMessage, server);
    publisher.send(catMessage, server);
 
    // On indique quels évènements chaque futur subscriber recevra.
    animalLover.listen("Dogs");
    animalLover.listen("Cats");
 
    oldCatLady.listen("Cats");
 
    // On enregistre les subscribers.
    server.addSubscriber(animalLover);
    server.addSubscriber(oldCatLady);
 
    // Le serveur fait suivre les messages en attente aux subscribers.
    server.forward();
 
    // On demande au subscriber de traiter les informations qu'il a reçu.
    System.out.println("animalLover has subcribed to the following messages :");
    animalLover.print();
 
    System.out.println("oldCatLady has subcribed to the following messages :");
    oldCatLady.print();
  }
}