观察者模式 ObServer Pattern

一、什么是观察者模式
Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。
Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。

二、观察者模式的结构

三、观察者模式的角色和职责
Subject(被观察者)
被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
ConcreteSubject
被观察者的具体实现。包含一些基本的属性状态及其他操作。
Observer(观察者)
接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
ConcreteObserver
观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。

四、观察者模式的典型应用

Observer模式的典型应用
- 侦听事件驱动程序设计中的外部事件
- 侦听/监视某个对象的状态变化

- 发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者

Person.java

import java.util.Observable; 
 
public class Person extends Observable { 
    private String name; 
    private String sex; 
    private int age; 
 
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
        this.setChanged(); 
        this.notifyObservers(); 
    } 
 
    public String getSex() { 
        return sex; 
    } 
 
    public void setSex(String sex) { 
        this.sex = sex; 
        this.setChanged(); 
        this.notifyObservers(); 
    } 
 
    public int getAge() { 
        return age; 
    } 
 
    public void setAge(int age) { 
        this.setChanged(); 
        this.notifyObservers(); 
        this.age = age; 
    } 
 
}

MyObserver.java

import java.util.Observable; 
import java.util.Observer; 
 
public class MyObServer implements Observer { 
 
    public void update(Observable o, Object arg) { 
        System.out.println("对象发生变化"); 
    } 
}

MainClass.java

public class MainClass { 
    public static void main(String[] args) { 
        Person person = new Person(); 
        //注册观察者 
        person.addObserver(new MyObServer()); 
        person.addObserver(new MyObServer()); 
        System.out.println(person.countObservers()); 
        person.setName("lifengxing"); 
        person.setAge(23); 
        person.setSex("男"); 
    } 
}

下面是一个关于博主发表博客文章的,运用了观察者模式的例子。。

Article.java

package com.ibeifeng.news; 
 
public class Article { 
    private String articleTitle; 
    private String articleContent; 
 
    public String getArticleTitle() { 
        return articleTitle; 
    } 
 
    public void setArticleTitle(String articleTitle) { 
        this.articleTitle = articleTitle; 
    } 
 
    public String getArticleContent() { 
        return articleContent; 
    } 
 
    public void setArticleContent(String articleContent) { 
        this.articleContent = articleContent; 
    } 
 
}

BlogUser.java

package com.ibeifeng.news; 
 
import java.util.Observable; 
 
public class BlogUser extends Observable { 
     
    public void publishBlog(String articleTitle,String articleContent) { 
        Article art = new Article(); 
        art.setArticleTitle(articleTitle); 
        art.setArticleContent(articleContent); 
        System.out.println("博主:发表新文章,文章标题:" + articleTitle + ",文章内容:" + articleContent); 
        this.setChanged(); 
        this.notifyObservers(art); 
    } 
}

MyObServer.java

package com.ibeifeng.news; 
 
import java.util.Observable; 
import java.util.Observer; 
 
public class MyObServer implements Observer { 
 
    public void update(Observable o, Object arg) { 
        Article art = (Article)arg; 
         
        System.out.println("博主发表了新的文章,快去看吧!"); 
        System.out.println("博客标题为:" + art.getArticleTitle()); 
        System.out.println("博客内容为:" + art.getArticleContent()); 
    } 
 
}

MainClass.java

package com.ibeifeng.news; 
   
public class MainClass { 
    public static void main(String[] args) { 
        BlogUser user = new BlogUser(); 
        user.addObserver(new MyObServer()); 
        user.publishBlog("哈哈,博客上线了", "大家多来访问"); 
    }  
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值