设计模式-----观察者模式(一)

学习观察者模式的通用代码;

步骤:

第一:是目标对象的定义;

第二:是具体目标对象的定义;

第三:观察者的接口定义;

第四:看看观察者的具体实现;

通用的代码如下:

Subject.java

import java.util.ArrayList;
import java.util.List;



/*
 * 目标对象,它知道观察它的观察者,并提供注册(添加)和删除观察者的接口
 * 
 */
public class Subject {
    //这个集合是用来保存注册的观察者对象;
    private List<Observer>  observers = new ArrayList<Observer>();
    //attach detach notifyObservers
    public void attach(Observer observer){
        observers.add(observer);
    }
    /*
     * 删除集合中的指定观察者;
     */
    public void detach(Observer observer){
        observers.remove(observer);
    }
    /*
     * 通知所有注册的观察者对象;
     */
    protected void notifyObesrvers(){
        for(Observer observer:observers){
            observer.update(this);
        }
    }
}
View Code

ConcreteSubject.java

/*
 * 具体的目标对象,负责把有关状态存入到响应的观察者对象
 * 
 * 
 */
public class ConcreteSubject extends Subject{
    //目标对象的状态;
    private String subjectState;

    public String getSubjectState() {
        return subjectState;
    }

    public void setSubjectState(String subjectState) {
        this.subjectState = subjectState;
        this.notifyObesrvers();
    }
    
}
View Code

Observer.java

/*
 *这是一个观察者接口,定义一个更新的接口给那些 在目标改变的时候被通知的对象;
 * 
 */
public interface Observer {
    /*
     * 
     * 更新的接口
     * @param subject 传入目标对象,方便获取相应的目标对象的状态
     */
    public void update(Subject subject);
    
}
View Code

ConcreteObserver.java

/*
 * 
 * 具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致;
 * 
 * */
public class ConcreteObserver implements Observer {
    private String observerState;
    @Override
    /**
     * 获取目标类的状态同步到观察者类中;
     */
    public void update(Subject subject) {
        observerState = ((ConcreteSubject)subject).getSubjectState();
        
        
    }

}
View Code

 改造通用的代码如下:

WeatherSubject.java

import java.util.ArrayList;
import java.util.List;



/*
 * 目标对象,它知道观察它的观察者,并提供注册(添加)和删除观察者的接口
 * 
 */
public class WeatherSubject {
    //这个集合是用来保存注册的观察者对象;
    private List<Observer>  observers = new ArrayList<Observer>();
    //attach detach notifyObservers;
    //把订阅天气的人,添加到订阅者列表中;
    public void attach(Observer observer){
        observers.add(observer);
    }
    /*
     * 删除集合中的指定订阅天气的人;
     */
    public void detach(Observer observer){
        observers.remove(observer);
    }
    /*
     * 通知所有注册的订阅了天气的人;
     */
    protected void notifyObesrvers(){
        for(Observer observer:observers){
            observer.update(this);
        }
    }
}
View Code

ConcreteWeatherSubject.java

/*
 * 具体的目标对象,负责把有关状态存入到响应的观察者对象
 * 
 * 
 */
public class ConcreteWeatherSubject extends WeatherSubject{
    //获取天气的内容
    private String WeatherContent;

    public String getWeatherContent() {
        return WeatherContent;
    }

    public void setWeatherContent(String weatherContent) {
        WeatherContent = weatherContent;
        //内容有了,说明天气更新了,通知所有订阅了天气的人;
        this.notifyObesrvers();
    }

    
    
}
View Code

Observer.java

/*
 *这是一个观察者接口,定义一个更新的接口给那些 在目标改变的时候被通知的对象;
 */
public interface Observer {
    /*
     * 更新的接口
     * @param subject 传入目标对象,方便获取相应的目标对象的状态
     */
    public void update(WeatherSubject subject);
}
View Code

ConcreteObserver.java

/*
 * 
 * 具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致;
 * 
 * */
public class ConcreteObserver implements Observer {
    
    //观察者的名字,是黄明的女朋友还是老妈;
    private String observerName;
    //根据内容的情况,这个消息从目标获取;
    private String WeatherContent;
    //提醒的内容;女朋友提醒约会,老妈提醒购物;
    private String remindThing;
    
    public String getObserverName() {
        return observerName;
    }
    public void setObserverName(String observerName) {
        this.observerName = observerName;
    }
    public String getWeatherContent() {
        return WeatherContent;
    }
    public void setWeatherContent(String weatherContent) {
        WeatherContent = weatherContent;
    }
    public String getRemindThing() {
        return remindThing;
    }
    public void setRemindThing(String remindThing) {
        this.remindThing = remindThing;
    }
    @Override
    /**
     * 获取目标类的状态同步到观察者类中;
     */
    public void update(WeatherSubject subject) {
        WeatherContent = ((ConcreteWeatherSubject)subject).getWeatherContent();
        System.out.println(observerName+"收到了"+WeatherContent+"提醒的内容"+remindThing);
        
    }

}
View Code

test.java

public class test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //创建目标
        ConcreteWeatherSubject weather = new ConcreteWeatherSubject();
        //创建观察者
        ConcreteObserver observergirl = new ConcreteObserver();
        observergirl.setObserverName("girl");
        observergirl.setRemindThing("约会了");
        ConcreteObserver observermother = new ConcreteObserver();
        observermother.setObserverName("mohter");
        observermother.setRemindThing("购物了");        
        //注册观察者
        weather.attach(observergirl);
        weather.attach(observermother);
        
        //目标发布天气
        weather.setWeatherContent("明天天气晴朗");
        
    }

}
View Code
原文地址:https://www.cnblogs.com/zht0915/p/4693406.html