From 90ff7af47e2b46505527e405dd10284d7c3515a4 Mon Sep 17 00:00:00 2001 From: Nikita Iryupin Date: Mon, 30 Nov 2020 16:10:49 +0100 Subject: [PATCH] Added observer and observable interface, implemented observable on ChannelBase --- .../omo/foodchain/channel/ChannelBase.java | 24 +++++++++++++++++-- .../omo/foodchain/util/ChannelObserver.java | 7 ++++++ .../sit/omo/foodchain/util/Observable.java | 7 ++++++ 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 src/main/java/cz/cvut/fel/sit/omo/foodchain/util/ChannelObserver.java create mode 100644 src/main/java/cz/cvut/fel/sit/omo/foodchain/util/Observable.java diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/channel/ChannelBase.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/channel/ChannelBase.java index 8e4358c..7039ffe 100644 --- a/src/main/java/cz/cvut/fel/sit/omo/foodchain/channel/ChannelBase.java +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/channel/ChannelBase.java @@ -3,16 +3,20 @@ package cz.cvut.fel.sit.omo.foodchain.channel; import cz.cvut.fel.sit.omo.foodchain.operation.Transaction; import cz.cvut.fel.sit.omo.foodchain.product.ProductType; import cz.cvut.fel.sit.omo.foodchain.requirement.Requirement; +import cz.cvut.fel.sit.omo.foodchain.util.ChannelObserver; +import cz.cvut.fel.sit.omo.foodchain.util.Observable; import java.util.PriorityQueue; import java.util.Queue; +import java.util.Set; -public abstract class ChannelBase implements IChannel -{ +public abstract class ChannelBase implements IChannel, Observable { protected ProductType productType; protected Queue requirements; protected Queue transactions; + private Set subscribers; + public ChannelBase(ProductType type) { this.requirements = new PriorityQueue<>(); @@ -47,6 +51,22 @@ public abstract class ChannelBase implements IChannel public void addRequirement(Requirement requirement) { this.requirements.add(requirement); + notifyAllObservers(); + } + + @Override + public void notifyAllObservers(){ + subscribers.forEach(subscriber -> subscriber.update(requirements.peek())); + } + + @Override + public void attach(ChannelObserver observer){ + subscribers.add(observer); + } + + @Override + public void detach(ChannelObserver observer){ + subscribers.remove(observer); } /** diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/util/ChannelObserver.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/util/ChannelObserver.java new file mode 100644 index 0000000..7111944 --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/util/ChannelObserver.java @@ -0,0 +1,7 @@ +package cz.cvut.fel.sit.omo.foodchain.util; + +import cz.cvut.fel.sit.omo.foodchain.requirement.Requirement; + +public interface ChannelObserver { + void update(Requirement requirement); +} diff --git a/src/main/java/cz/cvut/fel/sit/omo/foodchain/util/Observable.java b/src/main/java/cz/cvut/fel/sit/omo/foodchain/util/Observable.java new file mode 100644 index 0000000..41ca0c5 --- /dev/null +++ b/src/main/java/cz/cvut/fel/sit/omo/foodchain/util/Observable.java @@ -0,0 +1,7 @@ +package cz.cvut.fel.sit.omo.foodchain.util; + +public interface Observable { + void attach(ChannelObserver channelObserver); + void detach(ChannelObserver channelObserver); + void notifyAllObservers(); +}