diff --git a/flux/src/main/java/com/iluwatar/App.java b/flux/src/main/java/com/iluwatar/App.java index 9d4f497d2..5aac9bbca 100644 --- a/flux/src/main/java/com/iluwatar/App.java +++ b/flux/src/main/java/com/iluwatar/App.java @@ -3,6 +3,22 @@ package com.iluwatar; public class App { public static void main( String[] args ) { - System.out.println( "Hello World!" ); + // initialize + MenuStore menuStore = new MenuStore(); + Dispatcher.getInstance().registerStore(menuStore); + ContentStore contentStore = new ContentStore(); + Dispatcher.getInstance().registerStore(contentStore); + MenuView menuView = new MenuView(); + menuStore.registerView(menuView); + ContentView contentView = new ContentView(); + contentStore.registerView(contentView); + + // render initial view + menuView.render(); + contentView.render(); + + // user clicks another menu item + // this triggers action dispatching and eventually causes views to render with new content + menuView.itemClicked(MenuItem.COMPANY); } } diff --git a/flux/src/main/java/com/iluwatar/Content.java b/flux/src/main/java/com/iluwatar/Content.java index 2cd09ec63..f86e476cb 100644 --- a/flux/src/main/java/com/iluwatar/Content.java +++ b/flux/src/main/java/com/iluwatar/Content.java @@ -2,6 +2,16 @@ package com.iluwatar; public enum Content { - PRODUCTS, COMPANY; + PRODUCTS("Products - This page lists the company's products."), COMPANY("Company - This page displays information about the company."); + + private String title; + private Content(String title) { + this.title = title; + } + + @Override + public String toString() { + return title; + } } diff --git a/flux/src/main/java/com/iluwatar/ContentStore.java b/flux/src/main/java/com/iluwatar/ContentStore.java index df4fd1abf..6aa7ec733 100644 --- a/flux/src/main/java/com/iluwatar/ContentStore.java +++ b/flux/src/main/java/com/iluwatar/ContentStore.java @@ -1,11 +1,19 @@ package com.iluwatar; -public class ContentStore implements Store { +public class ContentStore extends Store { + + private Content content = Content.PRODUCTS; @Override public void onAction(Action action) { - // TODO Auto-generated method stub - + if (action.getType().equals(ActionType.CONTENT_CHANGED)) { + ContentAction contentAction = (ContentAction) action; + content = contentAction.getContent(); + notifyChange(); + } + } + + public Content getContent() { + return content; } - } diff --git a/flux/src/main/java/com/iluwatar/ContentView.java b/flux/src/main/java/com/iluwatar/ContentView.java index 2ee814849..6bfc86470 100644 --- a/flux/src/main/java/com/iluwatar/ContentView.java +++ b/flux/src/main/java/com/iluwatar/ContentView.java @@ -2,10 +2,17 @@ package com.iluwatar; public class ContentView implements View { + private Content content = Content.PRODUCTS; + @Override public void storeChanged(Store store) { - // TODO Auto-generated method stub - + ContentStore contentStore = (ContentStore) store; + content = contentStore.getContent(); + render(); } + @Override + public void render() { + System.out.println(content.toString()); + } } diff --git a/flux/src/main/java/com/iluwatar/Dispatcher.java b/flux/src/main/java/com/iluwatar/Dispatcher.java index ebe62b011..3790470e9 100644 --- a/flux/src/main/java/com/iluwatar/Dispatcher.java +++ b/flux/src/main/java/com/iluwatar/Dispatcher.java @@ -12,7 +12,7 @@ public class Dispatcher { private Dispatcher() { } - public Dispatcher getInstance() { + public static Dispatcher getInstance() { return instance; } @@ -21,6 +21,20 @@ public class Dispatcher { } public void menuItemSelected(MenuItem menuItem) { - + dispatchAction(new MenuAction(menuItem)); + switch (menuItem) { + case HOME: + case PRODUCTS: + default: + dispatchAction(new ContentAction(Content.PRODUCTS)); + break; + case COMPANY: + dispatchAction(new ContentAction(Content.COMPANY)); + break; + } + } + + private void dispatchAction(Action action) { + stores.stream().forEach((store) -> store.onAction(action)); } } diff --git a/flux/src/main/java/com/iluwatar/MenuItem.java b/flux/src/main/java/com/iluwatar/MenuItem.java index 6a789edbe..b313a6c54 100644 --- a/flux/src/main/java/com/iluwatar/MenuItem.java +++ b/flux/src/main/java/com/iluwatar/MenuItem.java @@ -2,6 +2,16 @@ package com.iluwatar; public enum MenuItem { - HOME, PRODUCTS, COMPANY; + HOME("Home"), PRODUCTS("Products"), COMPANY("Company"); + + private String title; + MenuItem(String title) { + this.title = title; + } + + @Override + public String toString() { + return title; + } } diff --git a/flux/src/main/java/com/iluwatar/MenuStore.java b/flux/src/main/java/com/iluwatar/MenuStore.java index 3ec3c9c96..1647554f0 100644 --- a/flux/src/main/java/com/iluwatar/MenuStore.java +++ b/flux/src/main/java/com/iluwatar/MenuStore.java @@ -1,11 +1,19 @@ package com.iluwatar; -public class MenuStore implements Store { +public class MenuStore extends Store { + private MenuItem selected = MenuItem.HOME; + @Override public void onAction(Action action) { - // TODO Auto-generated method stub - + if (action.getType().equals(ActionType.MENU_ITEM_SELECTED)) { + MenuAction menuAction = (MenuAction) action; + selected = menuAction.getMenuItem(); + notifyChange(); + } + } + + public MenuItem getSelected() { + return selected; } - } diff --git a/flux/src/main/java/com/iluwatar/MenuView.java b/flux/src/main/java/com/iluwatar/MenuView.java index d9334c538..3bbb67f7f 100644 --- a/flux/src/main/java/com/iluwatar/MenuView.java +++ b/flux/src/main/java/com/iluwatar/MenuView.java @@ -2,10 +2,27 @@ package com.iluwatar; public class MenuView implements View { + private MenuItem selected = MenuItem.HOME; + @Override public void storeChanged(Store store) { - // TODO Auto-generated method stub - + MenuStore menuStore = (MenuStore) store; + selected = menuStore.getSelected(); + render(); } + @Override + public void render() { + for (MenuItem item: MenuItem.values()) { + if (selected.equals(item)) { + System.out.println(String.format("* %s", item.toString())); + } else { + System.out.println(item.toString()); + } + } + } + + public void itemClicked(MenuItem item) { + Dispatcher.getInstance().menuItemSelected(item); + } } diff --git a/flux/src/main/java/com/iluwatar/Store.java b/flux/src/main/java/com/iluwatar/Store.java index 4dba46a7e..d6d63407a 100644 --- a/flux/src/main/java/com/iluwatar/Store.java +++ b/flux/src/main/java/com/iluwatar/Store.java @@ -1,7 +1,19 @@ package com.iluwatar; -public interface Store { +import java.util.LinkedList; +import java.util.List; - public void onAction(Action action); +public abstract class Store { + private List views = new LinkedList<>(); + + public abstract void onAction(Action action); + + public void registerView(View view) { + views.add(view); + } + + protected void notifyChange() { + views.stream().forEach((view) -> view.storeChanged(this)); + } } diff --git a/flux/src/main/java/com/iluwatar/View.java b/flux/src/main/java/com/iluwatar/View.java index d9de94a3d..f00b15dc5 100644 --- a/flux/src/main/java/com/iluwatar/View.java +++ b/flux/src/main/java/com/iluwatar/View.java @@ -3,5 +3,6 @@ package com.iluwatar; public interface View { public void storeChanged(Store store); - + + public void render(); }