Class Facade
public class Facade extends java.lang.Object implements IFacade
A base Singleton IFacade
implementation.
In PureMVC, the Facade
class assumes these
responsibilities:
- Initializing the
Model
,View
andController
Singletons. - Providing all the methods defined by the
IModel, IView, & IController
interfaces. - Providing the ability to override the specific
Model
,View
andController
Singletons created. - Providing a single point of contact to the application for
registering
Commands
and notifyingObservers
Example usage:
import org.puremvc.as3.patterns.facade.Facade;
import com.me.myapp.model.*;
import com.me.myapp.view.*;
import com.me.myapp.controller.*;
public class MyFacade extends Facade
{
// Notification constants. The Facade is the ideal
// location for these constants, since any part
// of the application participating in PureMVC
// Observer Notification will know the Facade.
public static final String GO_COMMAND = "go";
// Override Singleton Factory method
public synchronized static IFacade getInstance(Supplier<IFacade> facadeSupplier) {
if(instance == null) instance = facadeSupplier.get();
return instance;
}
// optional initialization hook for Facade
public void initializeFacade() {
super.initializeFacade();
// do any special subclass initialization here
}
// optional initialization hook for Controller
public void initializeController() {
// call super to use the PureMVC Controller Singleton.
super.initializeController();
// Otherwise, if you're implmenting your own
// IController, then instead do:
// if ( controller != null ) return;
// controller = MyAppController.getInstance(() -> new MyAppController());
// do any special subclass initialization here
// such as registering Commands
registerCommand( GO_COMMAND, () -> new com.me.myapp.controller.GoCommand() )
}
// optional initialization hook for Model
public void initializeModel() {
// call super to use the PureMVC Model Singleton.
super.initializeModel();
// Otherwise, if you're implmenting your own
// IModel, then instead do:
// if ( model != null ) return;
// model = MyAppModel.getInstance(() -> new MyAppModel());
// do any special subclass initialization here
// such as creating and registering Model proxys
// that don't require a facade reference at
// construction time, such as fixed type lists
// that never need to send Notifications.
registerProxy( new USStateNamesProxy() );
// CAREFUL: Can't reference Facade instance in constructor
// of new Proxys from here, since this step is part of
// Facade construction! Usually, Proxys needing to send
// notifications are registered elsewhere in the app
// for this reason.
}
// optional initialization hook for View
public void initializeView() {
// call super to use the PureMVC View Singleton.
super.initializeView();
// Otherwise, if you're implmenting your own
// IView, then instead do:
// if ( view != null ) return;
// view = MyAppView.getInstance(() -> new MyAppView());
// do any special subclass initialization here
// such as creating and registering Mediators
// that do not need a Facade reference at construction
// time.
registerMediator( new LoginMediator() );
// CAREFUL: Can't reference Facade instance in constructor
// of new Mediators from here, since this is a step
// in Facade construction! Usually, all Mediators need
// receive notifications, and are registered elsewhere in
// the app for this reason.
}
}
- See Also:
Model
,View
,Controller
,Notification
,Mediator
,Proxy
,SimpleCommand
,MacroCommand
-
Field Summary
Fields Modifier and Type Field Description protected IController
controller
protected static IFacade
instance
protected IModel
model
protected java.lang.String
SINGLETON_MSG
protected IView
view
-
Constructor Summary
Constructors Constructor Description Facade()
Constructor. -
Method Summary
Modifier and Type Method Description static IFacade
getInstance(java.util.function.Supplier<IFacade> factory)
Facade Singleton Factory methodboolean
hasCommand(java.lang.String notificationName)
Check if a Command is registered for a given Notificationboolean
hasMediator(java.lang.String mediatorName)
Check if a Mediator is registered or notboolean
hasProxy(java.lang.String proxyName)
Check if a Proxy is registeredprotected void
initializeController()
Initialize theController
.protected void
initializeFacade()
Initialize the SingletonFacade
instance.protected void
initializeModel()
Initialize theModel
.protected void
initializeView()
Initialize theView
.void
notifyObservers(INotification notification)
NotifyObserver
s.void
registerCommand(java.lang.String notificationName, java.util.function.Supplier<ICommand> commandSupplier)
Register anICommand
with theController
by Notification name.void
registerMediator(IMediator mediator)
Register aIMediator
with theView
.void
registerProxy(IProxy proxy)
Register anIProxy
with theModel
by name.void
removeCommand(java.lang.String notificationName)
Remove a previously registeredICommand
toINotification
mapping from the Controller.IMediator
removeMediator(java.lang.String mediatorName)
Remove anIMediator
from theView
.IProxy
removeProxy(java.lang.String proxyName)
Remove anIProxy
from theModel
by name.IMediator
retrieveMediator(java.lang.String mediatorName)
Retrieve anIMediator
from theView
.IProxy
retrieveProxy(java.lang.String proxyName)
Retrieve anIProxy
from theModel
by name.void
sendNotification(java.lang.String notificationName)
Create and send anINotification
.void
sendNotification(java.lang.String notificationName, java.lang.Object body)
Create and send anINotification
.void
sendNotification(java.lang.String notificationName, java.lang.Object body, java.lang.String type)
Create and send anINotification
.
-
Field Details
-
controller
-
model
-
view
-
instance
-
SINGLETON_MSG
protected final java.lang.String SINGLETON_MSG- See Also:
- Constant Field Values
-
-
Constructor Details
-
Facade
public Facade()Constructor.
This
IFacade
implementation is a Singleton, so you should not call the constructor directly, but instead call the static Singleton Factory methodFacade.getInstance()
- Throws:
java.lang.Error
- Error if Singleton instance has already been constructed
-
-
Method Details
-
initializeFacade
protected void initializeFacade()Initialize the Singleton
Facade
instance.Called automatically by the constructor. Override in your subclass to do any subclass specific initializations. Be sure to call
super.initializeFacade()
, though. -
getInstance
Facade Singleton Factory method
- Parameters:
factory
- facade Supplier Function- Returns:
- the Singleton instance of the Facade
-
initializeController
protected void initializeController()Initialize the
Controller
.Called by the
initializeFacade
method. Override this method in your subclass ofFacade
if one or both of the following are true:- You wish to initialize a different
IController
. - You have
Commands
to register with theController
at startup.
If you don't want to initialize a different
IController
, callsuper.initializeController()
at the beginning of your method, then registerCommand
s. - You wish to initialize a different
-
initializeModel
protected void initializeModel()Initialize the
Model
.Called by the
initializeFacade
method. Override this method in your subclass ofFacade
if one or both of the following are true:- You wish to initialize a different
IModel
. - You have
Proxy
s to register with the Model that do not retrieve a reference to the Facade at construction time.
If you don't want to initialize a different
IModel
, callsuper.initializeModel()
at the beginning of your method, then registerProxy
s.Note: This method is rarely overridden; in practice you are more likely to use a
Command
to create and registerProxy
s with theModel
, sinceProxy
s with mutable data will likely need to sendINotification
s and thus will likely want to fetch a reference to theFacade
during their construction. - You wish to initialize a different
-
initializeView
protected void initializeView()Initialize the
View
.Called by the
initializeFacade
method. Override this method in your subclass ofFacade
if one or both of the following are true:- You wish to initialize a different
IView
. - You have
Observers
to register with theView
If you don't want to initialize a different
IView
, callsuper.initializeView()
at the beginning of your method, then registerIMediator
instances.Note: This method is rarely overridden; in practice you are more likely to use a
Command
to create and registerMediator
s with theView
, sinceIMediator
instances will need to sendINotification
s and thus will likely want to fetch a reference to theFacade
during their construction. - You wish to initialize a different
-
registerCommand
public void registerCommand(java.lang.String notificationName, java.util.function.Supplier<ICommand> commandSupplier)Register an
ICommand
with theController
by Notification name.- Specified by:
registerCommand
in interfaceIFacade
- Parameters:
notificationName
- the name of theINotification
to associate theICommand
withcommandSupplier
- a reference to the Supplier Function of theICommand
-
removeCommand
public void removeCommand(java.lang.String notificationName)Remove a previously registered
ICommand
toINotification
mapping from the Controller.- Specified by:
removeCommand
in interfaceIFacade
- Parameters:
notificationName
- the name of theINotification
to remove theICommand
mapping for
-
hasCommand
public boolean hasCommand(java.lang.String notificationName)Check if a Command is registered for a given Notification
- Specified by:
hasCommand
in interfaceIFacade
- Parameters:
notificationName
- notification name- Returns:
- whether a Command is currently registered for the given
notificationName
.
-
registerProxy
Register an
IProxy
with theModel
by name.- Specified by:
registerProxy
in interfaceIFacade
- Parameters:
proxy
- theIProxy
instance to be registered with theModel
.
-
retrieveProxy
Retrieve an
IProxy
from theModel
by name.- Specified by:
retrieveProxy
in interfaceIFacade
- Parameters:
proxyName
- the name of the proxy to be retrieved.- Returns:
- the
IProxy
instance previously registered with the givenproxyName
.
-
removeProxy
Remove an
IProxy
from theModel
by name.- Specified by:
removeProxy
in interfaceIFacade
- Parameters:
proxyName
- theIProxy
to remove from theModel
.- Returns:
- the
IProxy
that was removed from theModel
-
hasProxy
public boolean hasProxy(java.lang.String proxyName)Check if a Proxy is registered
-
registerMediator
Register a
IMediator
with theView
.- Specified by:
registerMediator
in interfaceIFacade
- Parameters:
mediator
- a reference to theIMediator
-
retrieveMediator
Retrieve an
IMediator
from theView
.- Specified by:
retrieveMediator
in interfaceIFacade
- Parameters:
mediatorName
- mediator name- Returns:
- the
IMediator
previously registered with the givenmediatorName
.
-
removeMediator
Remove an
IMediator
from theView
.- Specified by:
removeMediator
in interfaceIFacade
- Parameters:
mediatorName
- name of theIMediator
to be removed.- Returns:
- the
IMediator
that was removed from theView
-
hasMediator
public boolean hasMediator(java.lang.String mediatorName)Check if a Mediator is registered or not
- Specified by:
hasMediator
in interfaceIFacade
- Parameters:
mediatorName
- mediator name- Returns:
- whether a Mediator is registered with the given
mediatorName
.
-
sendNotification
public void sendNotification(java.lang.String notificationName, java.lang.Object body, java.lang.String type)Create and send an
INotification
.Keeps us from having to construct new notification instances in our implementation code.
- Specified by:
sendNotification
in interfaceINotifier
- Parameters:
notificationName
- the name of the notiification to sendbody
- the body of the notificationtype
- the type of the notification
-
sendNotification
public void sendNotification(java.lang.String notificationName, java.lang.Object body)Create and send an
INotification
.Keeps us from having to construct new notification instances in our implementation code.
- Specified by:
sendNotification
in interfaceINotifier
- Parameters:
notificationName
- the name of the notiification to sendbody
- the body of the notification
-
sendNotification
public void sendNotification(java.lang.String notificationName)Create and send an
INotification
.Keeps us from having to construct new notification instances in our implementation code.
- Specified by:
sendNotification
in interfaceINotifier
- Parameters:
notificationName
- the name of the notiification to send
-
notifyObservers
Notify
Observer
s.This method is left public mostly for backward compatibility, and to allow you to send custom notification classes using the facade.
Usually you should just call sendNotification and pass the parameters, never having to construct the notification yourself.
- Specified by:
notifyObservers
in interfaceIFacade
- Parameters:
notification
- theINotification
to have theView
notifyObservers
of.
-