Skip to content

Instantly share code, notes, and snippets.

@IamCostello
Created March 28, 2020 15:20
Show Gist options
  • Select an option

  • Save IamCostello/b4c1d5860da50005c8167ea94fea26f4 to your computer and use it in GitHub Desktop.

Select an option

Save IamCostello/b4c1d5860da50005c8167ea94fea26f4 to your computer and use it in GitHub Desktop.

Revisions

  1. IamCostello created this gist Mar 28, 2020.
    15 changes: 15 additions & 0 deletions Consumer.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,15 @@
    package com.company;

    class Consumer{
    private Repository repository;

    public Consumer(Repository repository){
    this.repository = repository;
    }

    public void consume(){
    System.out.println("Consumed: ");
    repository.getProducts().forEach(System.out::println);
    repository.getProducts().clear();
    }
    }
    20 changes: 20 additions & 0 deletions ConsumerObserver.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,20 @@
    package com.company;

    import java.beans.PropertyChangeEvent;
    import java.beans.PropertyChangeListener;

    public class ConsumerObserver implements PropertyChangeListener {
    private RepositoryObservable repository;

    public ConsumerObserver(RepositoryObservable repository){
    this.repository = repository;
    }

    public void propertyChange(PropertyChangeEvent propertyChangeEvent){
    if(propertyChangeEvent.getPropertyName() == "hasProducts"){
    System.out.println("Consumed: ");
    repository.getProducts().forEach(System.out::println);
    repository.getProducts().clear();
    }
    }
    }
    25 changes: 25 additions & 0 deletions Main.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,25 @@
    package com.company;

    public class Main {

    public static void main(String[] args) throws InterruptedException {
    Repository repository = new Repository();
    Manufacturer manufacturer = new Manufacturer(repository);
    Manufacturer manufacturer2 = new Manufacturer(repository);
    Consumer consumer = new Consumer(repository);

    repository.addManufacturer(manufacturer);
    repository.addManufacturer(manufacturer2);
    repository.addConsumer(consumer);

    while(true){
    if(repository.hasSpace()){
    repository.notifyManufacturers();
    }
    if(repository.hasProducts()){
    repository.notifyConsumers();
    }
    Thread.sleep(1000);
    }
    }
    }
    25 changes: 25 additions & 0 deletions Main2.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,25 @@
    package com.company;

    public class Main {

    public static void main(String[] args) throws InterruptedException {
    RepositoryObservable repository = new RepositoryObservable();
    ManufacturerObserver manufacturer = new ManufacturerObserver(repository);
    ManufacturerObserver manufacturer2 = new ManufacturerObserver(repository);
    ConsumerObserver consumer = new ConsumerObserver(repository);

    repository.addManufacturer(manufacturer);
    repository.addManufacturer(manufacturer2);
    repository.addConsumer(consumer);

    repository.addPropertyChangeListener(manufacturer);
    repository.addPropertyChangeListener(manufacturer2);
    repository.addPropertyChangeListener(consumer);

    while(true){
    if(repository.hasSpace())
    if(repository.hasProducts())
    Thread.sleep(1000);
    }
    }
    }
    16 changes: 16 additions & 0 deletions Manufacturer.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,16 @@
    package com.company;

    class Manufacturer {
    static private int product = 0;
    private Repository repository;

    public Manufacturer(Repository repository){
    this.repository = repository;
    }

    public void produce(){
    System.out.println("Produced: " + product);
    repository.addProduct(product);
    product++;
    }
    }
    21 changes: 21 additions & 0 deletions ManufacturerObserver.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,21 @@
    package com.company;

    import java.beans.PropertyChangeEvent;
    import java.beans.PropertyChangeListener;

    public class ManufacturerObserver implements PropertyChangeListener {
    static private int product = 0;
    private RepositoryObservable repository;

    public ManufacturerObserver(RepositoryObservable repository){
    this.repository = repository;
    }

    public void propertyChange(PropertyChangeEvent propertyChangeEvent){
    if(propertyChangeEvent.getPropertyName() == "hasSpace"){
    System.out.println("Produced: " + product);
    repository.addProduct(product);
    product++;
    }
    }
    }
    48 changes: 48 additions & 0 deletions Repository.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,48 @@
    package com.company;

    import java.util.ArrayList;
    import java.util.List;

    class Repository {
    private List<Integer> products = new ArrayList<>(10);
    private List<Consumer> consumers = new ArrayList<>();
    private List<Manufacturer> manufacturers = new ArrayList<>();

    public void addConsumer(Consumer consumer){
    consumers.add(consumer);
    }

    public void addManufacturer(Manufacturer manufacturer){
    manufacturers.add(manufacturer);
    }

    public List<Integer> getProducts() {
    return products;
    }

    public void addProduct(int id){
    if(hasSpace()){
    products.add(id);
    }
    }

    public boolean hasSpace(){
    return products.size() < 10;
    }

    public boolean hasProducts(){
    return !products.isEmpty();
    }

    public void notifyManufacturers(){
    for(Manufacturer manufacturer: manufacturers){
    manufacturer.produce();
    }
    }

    public void notifyConsumers(){
    for(Consumer consumer : consumers){
    consumer.consume();
    }
    }
    }
    52 changes: 52 additions & 0 deletions RepositoryObservable.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,52 @@
    package com.company;

    import java.beans.PropertyChangeListener;
    import java.beans.PropertyChangeSupport;
    import java.util.ArrayList;
    import java.util.List;

    public class RepositoryObservable {
    private List<Integer> products = new ArrayList<>(10);
    private List<ConsumerObserver> consumers = new ArrayList<>();
    private List<ManufacturerObserver> manufacturers = new ArrayList<>();

    private PropertyChangeSupport notify;

    public RepositoryObservable(){
    notify = new PropertyChangeSupport(this);
    }

    public void addPropertyChangeListener(PropertyChangeListener propertyChangeListener){
    notify.addPropertyChangeListener(propertyChangeListener);
    }

    public void addConsumer(ConsumerObserver consumer){
    consumers.add(consumer);
    }

    public void addManufacturer(ManufacturerObserver manufacturer){
    manufacturers.add(manufacturer);
    }

    public List<Integer> getProducts() {
    return products;
    }

    public void addProduct(int id){
    if(products.size() < 10){
    products.add(id);
    }
    }

    public boolean hasSpace(){
    boolean state = products.size() < 10;
    notify.firePropertyChange("hasSpace", false, state);
    return state;
    }

    public boolean hasProducts(){
    boolean state = !products.isEmpty();
    notify.firePropertyChange("hasProducts", false, state);
    return state;
    }
    }