• 观察者模式(Observer)


    1 我觉得这个观察者模式很有趣的!!

    2 在软件系统中,我们有时需要定义一种一对多的依赖关系. 让多个观察者对象同时监听某一个主题对象, 这个主题对象在状态发生变化的时候,会通知所有的观察者对象,使他们能够自动更新自己。

    如:在你写好了博文的时候,你去表发了,你就可以利用这个观察者模式去通知你被关注的人!

    3 实现方式:该模式必须包含两个角色:观察者和被观察对象。就像上面的那个例子,博主就是被观察的对象,而关注博主的人就是观察者。

    4 “观察”:实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,从根本上违反面向对象的设计的原则。无论是观察者“观察”观察对象,还是被观察者将自己的改变“通知”观察者,都不应该直接调用。

    结构图:

    那么我们就来写一写这个代码:博主发博客。。。通知关注了他的人  他发了博客。。。。

    文章类:

     1 package com.lovo.Observer.two;
     2 public class Article {
     3     
     4     private String subject;
     5     
     6     private String Content;
     7 
     8     public String getSubject() {
     9         return subject;
    10     }
    11 
    12     public void setSubject(String subject) {
    13         this.subject = subject;
    14     }
    15 
    16     public String getContent() {
    17         return Content;
    18     }
    19 
    20     public void setContent(String content) {
    21         Content = content;
    22     }
    23 
    24         
    25 }

     被观察者:

     1 package com.lovo.Observer.two;
     2 import java.util.Observable;
     3 public class Blogger extends Observable{
     4     
     5     private String name;
     6     
     7     public String getName() {
     8         return name;
     9     }
    10 
    11     public void setName(String name) {
    12         this.name = name;
    13     }
    14 
    15     public void publish(Article wz){
    16         this.setChanged();// 标记此 Observable 对象为已改变的对象;现在 hasChanged 方法将返回 true。
    17         this.notifyObservers(wz);// 如果 hasChanged 方法指示对象已改变,则通知其所有观察者,
    18         
    19     }
    20 
    21 }

     观察者

     1 package com.lovo.Observer.two;
     2 import java.util.Observable;
     3 import java.util.Observer;
     4 
     5 
     6 public class Observer1 implements Observer {
     7 
     8     @Override
     9     public void update(Observable observerable, Object obj) {        
    10         Blogger bz = (Blogger) observerable;        
    11         Article wz = (Article) obj;
    12         
    13         System.out.println("博主:"+bz.getName());
    14         System.out.println("博主发表了新的博客");
    15         System.out.println("博客的主题为:"+wz.getSubject());
    16         System.out.println("博客的内容为:"+wz.getContent());
    17         
    18     }
    19 
    20 }

    测试类:

     1 package com.lovo.Observer.two;
     2 
     3 public class TestObserver {
     4 
     5      public static void main(String[] args) {
     6         
     7          Article wz = new Article();         
     8          wz.setSubject("这是我的第一篇博文");         
     9          wz.setContent("欢迎大家来看我的博客,我会好好努力的!。。。。。。");         
    10          Blogger bz = new Blogger();
    11          bz.setName("hellokitty燕");
    12          bz.addObserver(new Observer1());
    13          bz.publish(wz);
    14          
    15          
    16     }
    17     
    18 }

    实现结果为:

    博主:hellokitty燕
    博主发表了新的博客
    博客的主题为:这是我的第一篇博文
    博客的内容为:欢迎大家来看我的博客,我会好好努力的!。。。。。。

  • 相关阅读:
    msp430入门编程25
    msp430入门编程24
    msp430入门编程23
    msp430入门编程22
    msp430入门编程21
    msp430入门编程20
    msp430入门编程16
    msp430入门编程15
    msp430入门编程14
    msp430入门编程13
  • 原文地址:https://www.cnblogs.com/hellokitty1/p/4653033.html
Copyright © 2020-2023  润新知