Design Patterns >>> Observer patterns

Source: Internet
Author: User

#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

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.