Finished the Flux example.

This commit is contained in:
Ilkka Seppala 2015-05-03 23:07:07 +03:00
parent c288f13b21
commit 718b3cc61d
10 changed files with 123 additions and 20 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -3,5 +3,6 @@ package com.iluwatar;
public interface View {
public void storeChanged(Store store);
public void render();
}