设计模式-观察者模式

观察者模式中主要有4中角色:
1 抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)中,每个主题都可以有任意数量的观察者,抽象主题里提供接口,增加和删除观察者,通知观察者。
2 具体主题(ConcreteSubject)角色:将有关状态,存入具体的观察者对象,当自己状态发生改变时,通知所有的观察者
3 抽象观察者(Observer)角色:为所有的观察者定义一个更新接口
4 具体观察者(ConcreteObserver)角色:实现抽象观察者所定义的更新接口

上面这样说太抽象,下面举一个简单的例子来说明:

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

/*
 * 抽象主题角色类
 */
public abstract class Subject {

    private List<Observer> list = new ArrayList<Observer>();

    public void attach(Observer observer){
        list.add(observer);
        System.out.println("Attached an Observer!");
    }

    public void detach(Observer observer){
        list.remove(observer);
    }

    public void notifyObservers(String state){
        for (Observer observer:list){
            observer.update(state);
        }
    }

}
/*
 * 具体主题角色类
 */
public class ConcreteSubject extends Subject{

    private String state;

    public String getState(){
        return state;
    }

    public void change(String newState){
        state = newState;
        System.out.println("主题状态发生改变: " + state);
        this.notifyObservers(state);
    }
}
/*
 * 抽象观察者角色类
 */
public interface Observer {

    public void update(String state);
}
/*
 * 具体观察者角色类
 */
public class ConcreteObserver implements Observer{

    private String observerState;

    @Override
    public void update(String state) {
        // TODO Auto-generated method stub
        observerState = state;
        System.out.println("状态为:"+observerState);
    }

}
public class MainClient {

    public static void main(String[] args){
        ConcreteSubject subject = new ConcreteSubject();
        Observer observer = new ConcreteObserver();
        subject.attach(observer);
        subject.change("new State");
    }
}

运行结果:

Attached an Observer!
主题状态发生改变: new State
状态为:new State

代码很简单,这里就不多说了

观察者模式又分推模型和拉模型
推模型:主题对象向观察者推送主题的详细信息,不管观察者需不需要,很明显,刚才的例子就是推模型
拉模型:主题对象在通知观察者的时候,只传递少量信息。如果观察者需要更具体的信息,由观察者主动到主题对象中获取,相当于是观察者从主题对象中拉数据。一般这种模型的实现中,会把主题对象自身通过update()方法传递给观察者,这样在观察者需要获取数据的时候,就可以通过这个引用来获取了

拉模型例子:

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

/*
 * 抽象主题角色类
 */
public abstract class Subject {

    private List<Observer> list = new ArrayList<Observer>();

    public void attach(Observer observer){
        list.add(observer);
        System.out.println("Attached an Observer!");
    }

    public void detach(Observer observer){
        list.remove(observer);
    }

    public void notifyObservers(){
        for (Observer observer:list){
            observer.update(this);
        }
    }

}
/*
 * 具体主题角色类
 */
public class ConcreteSubject extends Subject{

    private String state;

    public String getState(){
        return state;
    }

    public void change(String newState){
        state = newState;
        System.out.println("主题状态发生改变: " + state);
        this.notifyObservers();
    }
}
/*
 * 抽象观察者角色类
 */
public interface Observer {

    public void update(Subject subject);
}
/*
 * 具体观察者角色类
 */
public class ConcreteObserver implements Observer{

    private String observerState;

    @Override
    public void update(Subject subject) {
        // TODO Auto-generated method stub
        observerState = ((ConcreteSubject)subject).getState();
        System.out.println("状态为:"+observerState);
    }

}
public class MainClient {

    public static void main(String[] args){
        ConcreteSubject subject = new ConcreteSubject();
        Observer observer = new ConcreteObserver();
        subject.attach(observer);
        subject.change("new State");
    }
}

运行结果:

Attached an Observer!
主题状态发生改变: new State
状态为:new State

好了,设计模式-观察者模式就总结到这里,如有问题,欢迎指正,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值