Created
February 10, 2012 14:14
-
-
Save ryan-beckett/1789850 to your computer and use it in GitHub Desktop.
MVC w/ event handlers and observers
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.*; | |
public class ControllerTest { | |
private static Controller controller = Controller.getInstance(); | |
private static View view = new View(); | |
private static LoginHandler loginHandler = new LoginHandler(); | |
public static void main(String[] args) { | |
controller.registerEventHandler(LoginEvent.class, loginHandler); | |
controller.registerForEventNotification(LoginEvent.class, view); | |
controller.handleEvent(new LoginEvent()); | |
} | |
} | |
//Your controller | |
class Controller { | |
private static Controller INSTANCE = new Controller(); | |
private Map<Class, EventHandler> handlers = new HashMap<Class, EventHandler>(); | |
private Map<Class, ArrayList<Observer>> obs = new HashMap<Class, ArrayList<Observer>>(); | |
private BusinessManager mngr = new BusinessManager(); | |
private Controller(){ | |
} | |
public static Controller getInstance() { | |
return INSTANCE; | |
} | |
public BusinessManager getBusinessManager() { | |
return mngr; | |
} | |
public void handleEvent(Event evt) { | |
handlers.get(evt.getClass()).handle(evt, obs.get(evt.getClass())); | |
} | |
public void registerEventHandler(Class evtClass, EventHandler handler) { | |
handlers.put(evtClass, handler); | |
} | |
public void registerForEventNotification(Class evtClass, Observer o) { | |
ArrayList<Observer> evtObs = obs.get(evtClass); | |
if(evtObs == null) { | |
evtObs = new ArrayList<Observer>(); | |
obs.put(evtClass, evtObs); | |
} | |
evtObs.add(o); | |
} | |
} | |
class LoginHandler implements EventHandler { | |
public LoginHandler() { | |
} | |
public void handle(Event evt, List<Observer> obs) { | |
Response resp = Controller.getInstance().getBusinessManager().handle(evt); | |
if(resp.getResult() == Response.SUCCESS) { | |
for(Observer o: obs) | |
o.observe(); | |
} | |
} | |
} | |
//Your view | |
class View implements Observer { | |
public View() { | |
} | |
public void observe() { | |
System.out.println("Notified of login, loading data."); | |
} | |
} | |
//Your model | |
class BusinessManager { | |
public BusinessManager() { | |
} | |
public Response handle(Event evt) { | |
if(evt instanceof LoginEvent) | |
return login(); | |
return null; | |
} | |
public Response login() { | |
return new LoginResponse(Response.SUCCESS); | |
} | |
} | |
class LoginResponse implements Response { | |
private int result; | |
public LoginResponse(int result) { | |
this.result = result; | |
} | |
public int getResult() { | |
return result; | |
} | |
} | |
class Event{} | |
class LoginEvent extends Event{} | |
interface EventHandler { void handle(Event evt, List<Observer> obs); } | |
interface Observer { void observe(); } | |
interface Response { int SUCCESS = 1, FAIL = 0; int getResult(); } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment