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(); +}