#1, what is the Observer pattern?
Observer mode = (publisher + subscriber) mode, the Observer pattern defines a one-to-many dependency that allows multiple observer objects to listen to a Subject object at the same time. This subject object notifies all observer objects when the state changes, enabling them to automatically update themselves.
For example: You have a news app, you subscribe to the programmer module, and when the module has a new article update, you can get the update in the first time. When you're tired of the content of this module, you can unsubscribe. Simply understand: Register---> Receive messages---> Cancel---> No notifications.
#2, how to use?
*2.1 Scene Description: Currently need to develop a news application, the user subscribes to a module, the system will actively send him the message of this module, the user unsubscribe, not to the user to push the module message.
The *2.2 design class diagram is as follows:
*2.3 Class Diagram Description
Abstract publisher (Newsservice): Abstract Viewer mode of the publishing center, registered subscribers, storage subscribers, delete subscribers, news push, can be likened to the most basic users to increase the deletion of the search.
Specific publisher (NEWSSERVICEIMPL): a specific implementation of the publishing center that sends notifications to all subscribers.
Abstract Subscriber (UserService): Abstract subscribers need the news information, display method.
Specific subscribers (Userone): The specific implementation of abstract subscribers, customizing the way news is displayed.
#3, project specific implementation details
*3.1 Project Structure
*3.2 Specific Code
1 Public InterfaceNewsservice {2 voidregisternews (UserService userservice);3 voidSetnewsinfo (Newsbean newsbean);4 voidnotifynews ();5 voidcanclenews (UserService userservice);6 7 voidsetState ();8 BooleangetState ();9}
1 Public Interface UserService {2 void updatenews (Newsbean newsbean); 3 void displaynews (); 4 }
1 Public classNewserviceimplImplementsNewsservice {2 Private BooleanState =false;3 PrivateNewsbean Newsbean;4 PrivateList<userservice> userservicelist =NULL;5 6 PrivateList<userservice>getuserservicelist () {7 if(Userservicelist = =NULL){8Userservicelist =NewArraylist<>();9 }Ten returnuserservicelist; One } A - /** - * Initialize the */ - PublicNewserviceimpl () { - getuserservicelist (); - } + - @Override + Public voidregisternews (UserService userservice) { A Userservicelist.add (userservice); at } - - @Override - Public voidcanclenews (UserService userservice) { - Userservicelist.remove (userservice); - } in - /** to * Notify all subscribing users + */ - @Override the Public voidnotifynews () { * for(UserService userservice:userservicelist) { $ userservice.updatenews (Newsbean);Panax Notoginseng } - } the + /** A * Set News information the * @paramNewsbean + */ - @Override $ Public voidSetnewsinfo (Newsbean newsbean) { $ This. Newsbean =Newsbean; - notifynews (); - } the - @OverrideWuyi Public voidsetState () { theState =true; - } Wu - @Override About Public BooleangetState () { $ return This. State; - } -}
1 Public classUseroneImplementsuserservice{2 PrivateNewsservice Newsservice;3 PrivateNewsbean Newsbean;4 /**5 * Subscribe to News6 * @paramNewsservice7 */8 PublicUserone (Newsservice newsservice) {9 This. Newsservice =Newsservice;TenNewsservice.registernews ( This); One } A @Override - Public voidupdatenews (Newsbean newsbean) { - This. Newsbean =Newsbean; the displaynews (); - } - - @Override + Public voiddisplaynews () { - System.out.println (Newsbean); + } A}
1 Public classUsertwoImplementsuserservice{2 PrivateNewsservice Newsservice;3 PrivateNewsbean Newsbean;4SimpleDateFormat SDF =NewSimpleDateFormat ("Yyyy-mm-dd");5 6 /**7 * Subscribe to News8 * @paramNewsservice9 */Ten Publicusertwo (Newsservice newsservice) { One This. Newsservice =Newsservice; ANewsservice.registernews ( This); - } - @Override the Public voidupdatenews (Newsbean newsbean) { - This. Newsbean =Newsbean; - displaynews (); - } + - @Override + Public voiddisplaynews () { ASYSTEM.OUT.PRINTLN ("\n>>> Advanced user Push message:" + "\ n" +newsbean.getnewstitle () + "\ T" at+sdf.format (Newsbean.getnewsdate ()) + "\ n" +newsbean.getnewscontent ()); - } -}
1 Public classNewssystem {2 3 Public Static voidMain (string[] args) {4Newsservice Newsservice =NewNewserviceimpl ();5 //User Type one6Userone Userone =NewUserone (newsservice);7 //User Type two8Usertwo Usertwo =NewUsertwo (newsservice);9 //News PushTenNewsservice.setnewsinfo (NewNewsbean ("Tiandaochouqin", "Xi said:" Heaven will not drop pies, "+ One"Striving hard can make a dream come true." ”",NewDate ())); A //user Type one unsubscribe - newsservice.canclenews (userone); - //Another news push theNewsservice.setnewsinfo (NewNewsbean ("Observer Mode", "observer mode = (publisher + subscriber)" + -"Mode",NewDate ())); - } -}
*3.3 Running Results
#4, Model Summary
*4.1 Advantages
In a loosely coupled way between publishers and subscribers, subscribers don't have to worry about how publishers can push messages to themselves;
Define a one-to-many dependency between objects and push messages uniformly for subscribers.
*4.2 Applicable Scenarios
When an object changes a common object, he does not know where to use the public object elsewhere.
Reprint please indicate address: http://www.cnblogs.com/huaxingtianxia/p/6266913.html
Design Patterns >>> Observer patterns