设计模式之观察者模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
即目标发生更改通知时,观察者对象会收到通知

观察者模式通用代码

分为
推模型——主动把某一数据推送给观察者
拉模型——观察者主动到目标对象中获取数据,一般这种模型的实现中,会把目标对象自身对象自身通过update方法传递给观察者

拉模型

目标对象,它自动观察他的观察值,并提供注册(添加)和删除观察者的接口

public class Subject {
    //用来保存注册的观察者对象
    private List<Observer> observers =new ArrayList<Observer>();

    /**
     * 添加集合中的指定观察者
     * @param observer
     */
    public void attach(Observer observer){
        observers.add(observer);
    }

    /**
     * 删除集合中指定观察者
     * @param observer
     */
    public void detach(Observer observer){
        observers.remove(observer);
    }
    /**
     * 通知所有注册的观察者对象
     */

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

观察者接口,定义一个更新的接口给那些在目标发生改变的时候被通知的对象

public interface Observer {
    /**
     * 更新的接口
     * @param subject 传入目标对象,方便获取相应的目标对象的状态
     */
    public void update(Subject subject);
    }

具体的目标对象,负责把有关状态存入到相应的观察者对象中

public class ConcreteSubject extends Subject{

    //目标对象的状态
    private String subjectState;

    public String getSubjectState() {
        return subjectState;
    }
    public void setSubjectState(String subjectState) {
        this.subjectState = subjectState;
        //状态设置了 使用父类通知观察者
        this.notifyObservers();
    }
}

具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致

public class ConcreteObserver implements Observer {
    //观察者名字
    private String observerName;

    //观察者的状态
    private String  observerState;

    private String  observerHandle;

    public String getObserverHandle() {
        return observerHandle;
    }

    public void setObserverHandle(String observerHandle) {
        this.observerHandle = observerHandle;
    }

    public String getObserverName() {
        return observerName;
    }

    public void setObserverName(String observerName) {
        this.observerName = observerName;
    }

    /**
     * 获取目标类的状态同步到观察者的状态中
     * @param subject 传入目标对象,方便获取相应的目标对象的状态
     */
    @Override
    public void update(Subject subject) {
        observerState =((ConcreteSubject)subject).getSubjectState();
        System.out.println(observerName+"收到了:"+observerState+",处理方式"+observerHandle);
    }
}

测试类

public class Client {
    public static void main(String[] args) {
        //1.创建目标
        ConcreteSubject concreteSubject=new ConcreteSubject();

        //2.创建观察者
        ConcreteObserver concreteObserver1=new ConcreteObserver();
        concreteObserver1.setObserverName("观察者一号");
        concreteObserver1.setObserverHandle("第一种处理方式");

        ConcreteObserver concreteObserver2= new ConcreteObserver();
        concreteObserver2.setObserverName("观察者二号");
        concreteObserver2.setObserverHandle("第二种处理方式");


        //3.注册观察者
        concreteSubject.attach(concreteObserver1);
        concreteSubject.attach(concreteObserver2);

        //目标设置状态
        concreteSubject.setSubjectState("目标状态改变");
    }
}

推模型

subject

 public void notifyObservers(){
        for(Observer observer:observers){
            observer.update(this);
            //observer.update(content);
        }
    }
    改成——>
     public void notifyObservers(String content){
        for(Observer observer:observers){
                  observer.update(content);
        }
    }

observer

 public void update(Subject subject);
 改成——>
 public void update(String Content);

ConcreteSubject

 public void setSubjectState(String subjectState) {
        this.subjectState = subjectState;
        //状态设置了 使用父类通知观察者
        this.notifyObservers();
    }
   改成——>
 //public void setSubjectState(String content){
        this.subjectState = subjectState;
        //状态设置了 使用父类通知观察者
        this.notifyObservers(content);
    }     

ConcreateObserver

public void update(Subject subject) {
        observerState =((ConcreteSubject)subject).getSubjectState();
        System.out.println(observerName+"收到了:"+observerState+",处理方式"+observerHandle);
    }
    改成——>
     public void update(String content) {
        //observerState=content;
        System.out.println(observerName+"收到了:"+observerState+",处理方式"+observerHandle);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值