Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.company;
- class Main
- {
- // Метод рекурсивной рассылки сообщения от одного узла к другим
- public static void Distribute(PostOffice P, Message message) {
- if(P.getObservers()!=null) {
- P.ReceiveMessege(message);
- P.NotifyObservers();
- for (PostOffice o : P.getObservers()) // Для каждого наблюдателя данного узла,
- Distribute(o, message); // Приводим этот наблюдатель к типу узла
- }
- }
- public static void main(String[] args)
- {
- System.out.println("asd");
- Message message1 = new Message("YOU READ SECRET MESSAGE",true);
- Message message2 = new Message("YOU READ USUAL MESSAGE",true);
- PostOffice A = new PostOffice("Архангельск");
- PostOffice B = new PostOffice("Брест");
- PostOffice C = new PostOffice("Царьград");
- PostOffice D = new PostOffice("Дмитров");
- PostOffice E = new PostOffice("Екатеринбург");
- PostOffice F = new PostOffice("Фрязино");
- PostOffice G = new PostOffice("Геленджик");
- PostOffice H = new PostOffice("Харьков");
- Employee a= new Postman("Александр");
- Employee b= new Postman("Борис");
- Spy c=new Spy("Цезарь");
- Employee d=new Postman("Денис");
- Employee e=new Postman("Евгений");
- Spy f=new Spy("Федор");
- Linked g=new Linked("Геннадий");
- Linked h=new Linked("Хабиб");
- A.RegisterEmployee(a,Post.POSTMAN);
- B.RegisterEmployee(b,Post.POSTMAN);
- C.RegisterEmployee(c,Post.SPY);
- D.RegisterEmployee(d,Post.POSTMAN);
- E.RegisterEmployee(e,Post.POSTMAN);
- F.RegisterEmployee(f,Post.SPY);
- G.RegisterEmployee(g, Post.CLEANER);
- H.RegisterEmployee(h, Post.ACCOUNTER);
- A.RegisterObserver(B);
- A.RegisterObserver(C);
- C.RegisterObserver(D);
- C.RegisterObserver(E);
- C.RegisterObserver(G);
- B.RegisterObserver(F);
- F.RegisterObserver(H);
- c.RegisterLinked(g);
- f.RegisterLinked(h);
- Distribute(A, message1);
- Distribute(C, message2);
- Linked.getNychka();
- /* Node node1 = new Node("Node_1"); // Первый наблюдаемый (сам не наблюдает ни за кем)
- Node node2 = new Node("Node_2",node1); // Узел, который наблюдает за node1
- Node node3 = new Node("Node_3", node1);
- SpyNode spyNode1 = new SpyNode("SpyNode1", node3); // Секретный узел, который наблюдае за node3
- Node node4 = new Node("Node_5", spyNode1);
- SpyNode spyNode2 = new SpyNode("SpyNode2", node4);
- // Рассылаем сообщение message1 от узла node1
- Distribute(node1, message1);
- // Рассылаем сообщение message2 от узла node1
- Distribute(node1, message2);
- // Секретная информация в нычке
- SpyNode.getNychka();*/
- }
- }
- package com.company;
- public abstract class Employee {
- private String name;
- protected Message mes;
- public Employee(String name) {
- this.name = name;
- }
- public String getName() {
- return this.name;
- }
- public void setName(String name) {
- this.name = name;
- }
- abstract public Message toWork();
- abstract public void toWork(Message mes);
- }
- package com.company;
- public class Postman extends Employee {
- public Postman(String name) {
- super(name);
- }
- public void receiveMessage(Message mes)
- {
- this.mes=mes;
- }
- public Message sendMessage()
- {
- return mes;
- }
- @Override
- public void toWork(Message mes) {
- receiveMessage(mes);
- }
- @Override
- public Message toWork() {
- return sendMessage();
- }
- }
- package com.company;
- import java.util.ArrayList;
- import java.util.List;
- public class Spy extends Postman {
- List<Linked> linkeds = new ArrayList<>();
- public Spy(String name) {
- super(name);
- }
- public void RegisterLinked(Linked l) // Добавляем наблюдателя в список
- {
- linkeds.add(l);
- }
- public void RemoveLinked(Linked l) // Удаляем наблюдателя из списка
- {
- linkeds.remove(l);
- }
- @Override
- public Message toWork() {
- doDirtyWork();
- return sendMessage();
- }
- public void doDirtyWork()
- {
- if(mes.getSecret()) {
- for (Linked l : linkeds) {
- l.toWork(this.mes);
- }
- }
- }
- }
- package com.company;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * Created by Максим on 06.12.2015.
- */
- public class Linked extends Employee {
- public static List<String> nychka = new ArrayList<>();
- private Message mes;
- public Linked(String name) {
- super(name);
- }
- @Override
- public Message toWork() {
- return new Message("Я связный сотрудник",false);
- }
- public void receiveMessage(Message mes)
- {
- this.mes=mes;
- }
- @Override
- public void toWork(Message mes) {
- receiveMessage(mes);
- if(!Linked.nychka.contains(mes.text))
- Linked.nychka.add(mes.text);
- }
- public static void getNychka()
- {
- System.out.println("В нычке находится: ");
- for(String str:nychka)
- System.out.println(str);
- }
- }
- package com.company;
- import java.util.*;
- /**
- * Created by Максим on 06.12.2015.
- */
- public class PostOffice {
- private String Name;
- private Map<Employee,Post> employees;
- private List<PostOffice> observers;
- private Message mes;
- PostOffice(String name)
- {
- observers = new ArrayList<PostOffice>();
- this.Name = name;
- employees = new HashMap<Employee,Post>();
- }
- public String getName() {
- return this.Name;
- }
- public Map<Employee, Post> getEmployees() {
- return this.employees;
- }
- public List<PostOffice> getObservers()
- {
- return this.observers;
- }
- public void RegisterObserver(PostOffice o) // Добавляем наблюдателя в список
- {
- observers.add(o);
- }
- public void RemoveObserver(PostOffice o) // Удаляем наблюдателя из списка
- {
- observers.remove(o);
- }
- public void RegisterEmployee(Employee o,Post p) // Добавляем наблюдателя в список
- {
- employees.put(o, p);
- }
- public void RemoveEmployee(Employee o) // Удаляем наблюдателя из списка
- {
- employees.remove(o);
- }
- public void ReceiveMessege(Message mes) {
- this.mes = mes;
- Iterator<Map.Entry<Employee, Post>> itr = employees.entrySet().iterator();
- while (itr.hasNext()) {
- Map.Entry<Employee, Post> entry = itr.next();
- if(entry.getValue().toString().contains(Post.POSTMAN.toString())||entry.getValue().toString().contains(Post.SPY.toString()))
- entry.getKey().toWork(mes);
- }
- }
- public void NotifyObservers() // Шлём каждому наблюдателю сообщение от наблюдаемого
- {
- Iterator<Map.Entry<Employee, Post>> itr = employees.entrySet().iterator();
- while (itr.hasNext()) {
- Map.Entry<Employee, Post> entry = itr.next();
- if(entry.getValue().toString().contains(Post.POSTMAN.toString())||entry.getValue().toString().contains(Post.SPY.toString()))
- for (PostOffice p : observers) {
- p.ReceiveMessege(entry.getKey().toWork());
- System.out.printf("%s слать сообщение \"%s\" by Postman %s", this.Name, mes.text, entry.getKey().getName());
- p.Send(entry.getKey().toWork());
- }
- }
- }
- /* public void NotifyObservers(Message message) // Шлём каждому наблюдателю сообщение от наблюдаемого
- {
- this.mes = mes;
- for (Employee e : employees) {
- for (PostOffice o : observers) {
- o.Send(e.toWork(message));
- System.out.printf(" to %s by Postman %s \n", o.Name, e.getName());
- }
- }
- }
- */
- public void Send(Message mes)
- {
- System.out.printf(" to %s \n", this.Name);
- }
- }
- package com.company;
- /**
- * Created by Максим on 07.12.2015.
- */
- public enum Post {
- POSTMAN,
- ACCOUNTER,
- ASSISTANT,
- SPY,
- LINKED,
- CLEANER
- }
- package com.company;
- public class Message {
- private boolean secret;
- public String text; // Информационная часть сообщения
- Message(String text, boolean secret)
- {
- this.text = text;
- this.secret = secret;
- }
- public boolean getSecret(){
- return secret;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment