设计者模式属于行为模式,其意图是定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并自动更新。下面通过例子来说明这一模式。

首先是高层的观察者接口

IObserver.java

public interface IObserver{
    //更新方法,参数为主题对象和更新参数
    void update(Subject subject,Object args);
}

一个具体的观察者:

Customer.java

public class Customer implements IObserver{
    @Override
    public void update(Subject subject,Object args){
        System.out.println("Customer 获得了新消息 ["+args+"]");
    }
}

另一个具体的观察者:

TV.java

public class implements IObserver{
    @Override
    public void update(Subject subject,Object args){
        System.out.println("TV 获得了新消息 ["+args+"]");
    }
}

主题抽象类:

Subject.java

public abstract class Subject{
    private Vector<IObserver> observers;
    
    public Subject(){
        observers=new Vector<IObserver>();
    }
    
    public synchronized void addObserver(IObserver observer){
        observers.add(observer);
    }
    
    public synchronized void removeObserver(IObserver observer){
        observers.remove(observer);
    }
    
    public synchronized void removeObservers(){
        observers.clear();
    }
    
    public synchronized void notifyObservers(Object args){
        for(IObserver observer:observers){
            observer.update(this,args);
        }
    }
}

一个具体的主题:新闻发布者

NewsPublisher.java

public class NewsPublisher extends Subject{
    private String news;
    public void setNews(String news){
        if(news!=null&&!news.equals(this.news)){
            this.news=news;
            this.notifyObservers(news);
        }
    }
}

客户端代码

Client.java

public class Client{
    public static void main(String[] args){
        NewsPublisher newsPublisher=new NewsPublisher();
        
        newsPublisher.addObserver(new Customer());
        newsPublisher.removeObserver(new TV());
        
        newsPublisher.setNews("空调大降价");
    }
}

运行结果如下:

Customer获得了新消息[空调大降价]

TV 获得了新消息[空调大降价]


(end)