Skip to content

Instantly share code, notes, and snippets.

@ryan-beckett
Created February 10, 2012 14:14
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ryan-beckett/1789850 to your computer and use it in GitHub Desktop.
Save ryan-beckett/1789850 to your computer and use it in GitHub Desktop.
MVC w/ event handlers and observers
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