{"id":1099,"date":"2012-04-17T04:00:00","date_gmt":"2012-04-17T04:00:00","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/2012\/10\/java-ee-revisits-design-patterns-observer.html"},"modified":"2012-10-21T23:31:34","modified_gmt":"2012-10-21T23:31:34","slug":"java-ee-revisits-design-patterns_17","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html","title":{"rendered":"Java EE Revisits Design Patterns: Observer"},"content":{"rendered":"<div dir=\"ltr\" style=\"text-align: left\">Aside from being implemented in many languages and many applications, Observer Pattern has been a part of Java since version 1.0. Observer Pattern is also a good implementation of <a href=\"http:\/\/en.wikipedia.org\/wiki\/Hollywood_Principle\">Hollywood Principle<\/a>. Just like Agents in Hollywood like to callback the candidates for a role instead of being called daily to be asked about available jobs, most of the server side resources like the push the available data to the appropriate client instead of being asked for updates on a time interval. <\/p>\n<p>Such time interval queries can be both consuming to much resource on the server and also cause more network traffic than actually needed. Although Java had support for Observer Pattern since day 0, it is always argued to be not the best implementation (Have a look at <a href=\"http:\/\/docs.oracle.com\/javase\/1.4.2\/docs\/api\/java\/util\/Observer.html\">Observer <\/a>and <a href=\"http:\/\/docs.oracle.com\/javase\/1.4.2\/docs\/api\/java\/util\/Observable.html\">Observable<\/a>). Being on JavaEE world may even complicate things. However JavaEE6 comes with an alternative. <\/p>\n<p>JavaEE6 offers &#8216;@Observable&#8217; annotation as an easy out of box implementation of Observer Pattern. Lets <a href=\"http:\/\/www.devchronicles.com\/2011\/11\/javaee-revisits-design-patterns-factory.html\">visit the previous post<\/a> and extend it to use observers.  <\/p>\n<pre class=\"brush:java\">package com.devchronicles.observer;\r\n\r\n\r\nimport javax.ejb.Stateless;\r\nimport javax.ejb.TransactionAttribute;\r\nimport javax.ejb.TransactionAttributeType;\r\nimport javax.enterprise.event.Event;\r\nimport javax.inject.Inject;\r\n\r\n\r\n\/**\r\n *\r\n * @author Murat Yener\r\n *\/\r\n@Stateless\r\n@TransactionAttribute(TransactionAttributeType.REQUIRED)\r\npublic class EventService {\r\n    @Inject\r\n    private String message;\r\n    \r\n    @Inject \r\n    Event&lt;String&gt; event;\r\n    \r\n    public void startService(){\r\n        System.out.println(\"start service call \"+message);\r\n        event.fire(\"this is my \"+message);\r\n        System.out.println(\"done...\");\r\n    }\r\n}\r\n<\/pre>\n<p>The EventService class will be injected an Event object of type String which can be used to fire String objects. If you had not read the previous post,  message object is a String which will be produced by a factory and injected to the EventService class. To make it simpler you can just type any string constant to the variable called message. <div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>Since we are already done with the observable part, now it is time to create an observer to listen our events. <\/p>\n<pre class=\"brush:java\">package com.devchronicles.observer;\r\n\r\n\r\nimport javax.ejb.Stateless;\r\nimport javax.enterprise.event.Observes;\r\n\r\n\r\n\/**\r\n *\r\n * @author Murat Yener\r\n *\/\r\n@Stateless\r\npublic class EventObserver {\r\n\r\n\r\n    public void doLogging(@Observes String message){\r\n        System.out.println(\"Observed:\"+message);\r\n    }\r\n}\r\n<\/pre>\n<p>The Observes annotation marks the method as an observer for fired String events. If you run the server and fire up start service method, you will realize how magically a string will be injected to EventService class and than fired where it will be caughed (observed) by EventObserver class. Surprisingly that is all you need to implement the observer pattern in JavaEE6. <\/p>\n<p>As seen before, JavaEE6 offers an easy way to implement the Observer Pattern. After publishing the post, I had receive few questions on how to differentiate string types that are fired and observed. <\/p>\n<p>Although in real world scenarios you wouldn&#8217;t probably firing and observing plain strings but your own objects which would be observed by their type, still it is pretty easy to differentiate same type of objects and setup different observers to listen them. <\/p>\n<p>First lets start with the part to differentiate plain strings.  <\/p>\n<pre class=\"brush:java\">package com.devchronicles.observer;\r\n\r\n\r\nimport java.lang.annotation.ElementType;\r\nimport java.lang.annotation.Retention;\r\nimport java.lang.annotation.RetentionPolicy;\r\nimport java.lang.annotation.Target;\r\nimport javax.inject.Qualifier;\r\n\r\n\r\n\/**\r\n *\r\n * @author Murat Yener\r\n *\/\r\n@Qualifier\r\n@Retention(RetentionPolicy.RUNTIME)\r\n@Target({ElementType.FIELD,ElementType.PARAMETER})\r\npublic @interface MyEvent {\r\n    \r\n    Type value();\r\n    \r\n    enum Type{\r\n        LOGGING, MESSAGE\r\n    } \r\n}\r\n<\/pre>\n<p>The interface above will act as annotation to mark the string to be fired and later to be observed just by annotating the appropriate parts. <\/p>\n<pre class=\"brush:java\">package com.devchronicles.observer;\r\n\r\n\r\nimport javax.ejb.Stateless;\r\nimport javax.ejb.TransactionAttribute;\r\nimport javax.ejb.TransactionAttributeType;\r\nimport javax.enterprise.event.Event;\r\nimport javax.inject.Inject;\r\n\r\n\r\n\/**\r\n *\r\n * @author Murat Yener\r\n *\/\r\n@Stateless\r\n@TransactionAttribute(TransactionAttributeType.REQUIRED)\r\npublic class EventService {\r\n    @Inject\r\n    private String message;\r\n    \r\n    @Inject @MyEvent(MyEvent.Type.LOGGING)\r\n    Event&lt;String&gt; event;\r\n\r\n\r\n    @Inject @MyEvent(MyEvent.Type.MESSAGE)\r\n    Event&lt;String&gt; anotherEvent;\r\n    \r\n    public void startService(){\r\n        System.out.println(\"start service call \"+message);\r\n        event.fire(\"this is my \"+message);\r\n        System.out.println(\"done...\");\r\n        anotherEvent.fire(\"done with the service!\");\r\n    }\r\n}\r\n<\/pre>\n<p>We just add MyEvent annotation with the desired type and later fire the events as we did before. The parts marked with red is all we added to the example in the previous post. <\/p>\n<p>Now lets annotate the observer part. Again We will be just adding the red parts to the previous example. <\/p>\n<pre class=\"brush:java\">package com.devchronicles.observer;\r\n\r\nimport javax.ejb.Stateless;\r\nimport javax.enterprise.event.Observes;\r\n\r\n\/**\r\n *\r\n * @author Murat Yener\r\n *\/\r\n@Stateless\r\npublic class EventObserver {\r\n\r\n    public void doLogging(@Observes @MyEvent(MyEvent.Type.LOGGING) String message){\r\n        System.out.println(\"Observed:\"+message);\r\n    }\r\n\r\n\r\n\r\n    public void doLogging(@Observes @MyEvent(MyEvent.Type.MESSAGE) String message){\r\n        System.out.println(\"Observed another type of message:\"+message);\r\n    }\r\n}\r\n<\/pre>\n<p>That would be all you would need to differentiate even the same type of objects to observe.   <\/p>\n<p><strong><i>Reference: <\/i><\/strong><a href=\"http:\/\/www.devchronicles.com\/2011\/11\/javaee-revisits-design-patterns_28.html\"> JavaEE Revisits Design Patterns: Observer <\/a>,<a href=\"http:\/\/www.devchronicles.com\/2011\/12\/javaee-revisits-design-patterns.html\"> JavaEE Revisits Design Patterns: Observer Part 2  <\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/p\/jcg.html\">JCG partner<\/a> Murat Yener at the <a href=\"http:\/\/www.devchronicles.com\/\">Developer Chronicles<\/a> blog. <\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Aside from being implemented in many languages and many applications, Observer Pattern has been a part of Java since version 1.0. Observer Pattern is also a good implementation of Hollywood Principle. Just like Agents in Hollywood like to callback the candidates for a role instead of being called daily to be asked about available jobs, &hellip;<\/p>\n","protected":false},"author":199,"featured_media":148,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[145,289],"class_list":["post-1099","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-design-patterns","tag-java-ee6"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Java EE Revisits Design Patterns: Observer - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Aside from being implemented in many languages and many applications, Observer Pattern has been a part of Java since version 1.0. Observer Pattern is also\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java EE Revisits Design Patterns: Observer - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Aside from being implemented in many languages and many applications, Observer Pattern has been a part of Java since version 1.0. Observer Pattern is also\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2012-04-17T04:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-10-21T23:31:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/java-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Murat Yener\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Murat Yener\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/04\\\/java-ee-revisits-design-patterns_17.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/04\\\/java-ee-revisits-design-patterns_17.html\"},\"author\":{\"name\":\"Murat Yener\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/861bfff7914e59f7e8384313b9f3e2fc\"},\"headline\":\"Java EE Revisits Design Patterns: Observer\",\"datePublished\":\"2012-04-17T04:00:00+00:00\",\"dateModified\":\"2012-10-21T23:31:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/04\\\/java-ee-revisits-design-patterns_17.html\"},\"wordCount\":523,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/04\\\/java-ee-revisits-design-patterns_17.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/java-logo.jpg\",\"keywords\":[\"Design Patterns\",\"Java EE6\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/04\\\/java-ee-revisits-design-patterns_17.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/04\\\/java-ee-revisits-design-patterns_17.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/04\\\/java-ee-revisits-design-patterns_17.html\",\"name\":\"Java EE Revisits Design Patterns: Observer - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/04\\\/java-ee-revisits-design-patterns_17.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/04\\\/java-ee-revisits-design-patterns_17.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/java-logo.jpg\",\"datePublished\":\"2012-04-17T04:00:00+00:00\",\"dateModified\":\"2012-10-21T23:31:34+00:00\",\"description\":\"Aside from being implemented in many languages and many applications, Observer Pattern has been a part of Java since version 1.0. Observer Pattern is also\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/04\\\/java-ee-revisits-design-patterns_17.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/04\\\/java-ee-revisits-design-patterns_17.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/04\\\/java-ee-revisits-design-patterns_17.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/java-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/java-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/04\\\/java-ee-revisits-design-patterns_17.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Java EE Revisits Design Patterns: Observer\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/861bfff7914e59f7e8384313b9f3e2fc\",\"name\":\"Murat Yener\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/144f5303f98cad874e236c6ee03e6975d6b8ee49fc24908aaa328910b803836d?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/144f5303f98cad874e236c6ee03e6975d6b8ee49fc24908aaa328910b803836d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/144f5303f98cad874e236c6ee03e6975d6b8ee49fc24908aaa328910b803836d?s=96&d=mm&r=g\",\"caption\":\"Murat Yener\"},\"sameAs\":[\"http:\\\/\\\/www.devchronicles.com\\\/\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Murat-Yener\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Java EE Revisits Design Patterns: Observer - Java Code Geeks","description":"Aside from being implemented in many languages and many applications, Observer Pattern has been a part of Java since version 1.0. Observer Pattern is also","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html","og_locale":"en_US","og_type":"article","og_title":"Java EE Revisits Design Patterns: Observer - Java Code Geeks","og_description":"Aside from being implemented in many languages and many applications, Observer Pattern has been a part of Java since version 1.0. Observer Pattern is also","og_url":"https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2012-04-17T04:00:00+00:00","article_modified_time":"2012-10-21T23:31:34+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/java-logo.jpg","type":"image\/jpeg"}],"author":"Murat Yener","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Murat Yener","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html"},"author":{"name":"Murat Yener","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/861bfff7914e59f7e8384313b9f3e2fc"},"headline":"Java EE Revisits Design Patterns: Observer","datePublished":"2012-04-17T04:00:00+00:00","dateModified":"2012-10-21T23:31:34+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html"},"wordCount":523,"commentCount":1,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/java-logo.jpg","keywords":["Design Patterns","Java EE6"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html","url":"https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html","name":"Java EE Revisits Design Patterns: Observer - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/java-logo.jpg","datePublished":"2012-04-17T04:00:00+00:00","dateModified":"2012-10-21T23:31:34+00:00","description":"Aside from being implemented in many languages and many applications, Observer Pattern has been a part of Java since version 1.0. Observer Pattern is also","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/java-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/java-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2012\/04\/java-ee-revisits-design-patterns_17.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Java EE Revisits Design Patterns: Observer"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/861bfff7914e59f7e8384313b9f3e2fc","name":"Murat Yener","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/144f5303f98cad874e236c6ee03e6975d6b8ee49fc24908aaa328910b803836d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/144f5303f98cad874e236c6ee03e6975d6b8ee49fc24908aaa328910b803836d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/144f5303f98cad874e236c6ee03e6975d6b8ee49fc24908aaa328910b803836d?s=96&d=mm&r=g","caption":"Murat Yener"},"sameAs":["http:\/\/www.devchronicles.com\/"],"url":"https:\/\/www.javacodegeeks.com\/author\/Murat-Yener"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/1099","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/199"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=1099"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/1099\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/148"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=1099"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=1099"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=1099"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}