Added observer and observable interface, implemented observable on ChannelBase

This commit is contained in:
Nikita Iryupin 2020-11-30 16:10:49 +01:00
parent 5a6fc28b76
commit 90ff7af47e
3 changed files with 36 additions and 2 deletions

View File

@ -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.operation.Transaction;
import cz.cvut.fel.sit.omo.foodchain.product.ProductType; 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.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.PriorityQueue;
import java.util.Queue; 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 ProductType productType;
protected Queue<Requirement> requirements; protected Queue<Requirement> requirements;
protected Queue<Transaction> transactions; protected Queue<Transaction> transactions;
private Set<ChannelObserver> subscribers;
public ChannelBase(ProductType type) public ChannelBase(ProductType type)
{ {
this.requirements = new PriorityQueue<>(); this.requirements = new PriorityQueue<>();
@ -47,6 +51,22 @@ public abstract class ChannelBase implements IChannel
public void addRequirement(Requirement requirement) public void addRequirement(Requirement requirement)
{ {
this.requirements.add(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);
} }
/** /**

View File

@ -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);
}

View File

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