学习java观察者模式笔记

    在学习到java MVC模式的时候,发现view和mode的关系搞不太清楚,所以在各种百度下总结了一些,现在记下来免得以后忘记了。

    MVC中 View 事先注册在 Mode中  通过Control来修改Mode ,Mode在通知View更新。。也就是说Mode.addObserver(View)  但是View又需要Mode提供数据,所以需要View.addMode()  ,之后也需要Control.addMode()  也就是说Control和View通过Mode进行联系,两者并没有直接的联系。

  view和mode这种模式,也被称为观察者模式,view称为观察者,而mode称为被观察者,这是一个一对多的关系,就是说mode中可以注册多个view,当mode改变时通知所有注册过的view并进行相应的更新。理解到这里还是通过代码会更清楚。所以又做了一个小demo。

 

    首先写一个观察者接口,里面就一个方法update用于更新状态

 package com.pattern.observer;

/**
 * 观察者
 * @author blackcup
 *
 */
public interface Observer {

    /**
     * 更新的接口
     */
    public void update();
}


  再写一个实体类ViewObserver实现接口Observer

package com.pattern.observer;

public class ViewObserver implements Observer{

    
    @Override
    public void update() {
        // TODO Auto-generated method stub
        System.out.println("View状态更新");
    }

}

    

在写抽象类subject 维护一个list,用来存储observer, 提供删除添加和通知所有观察者的方法

package com.pattern.observer;

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

public abstract class Subject {

    private List<Observer> oberverList = new ArrayList<Observer>();
    
    /**
     * 添加观察者
     * @param observer
     */
    public void addObserver(Observer observer) {
        oberverList.add(observer);
    }
    
    /**
     * 删除观察者
     */
    public void delObserver(Observer observer) {
        oberverList.remove(observer);
    }
    
    /**
     * 通知所有观察者,并调用更新方法
     */
    public void notifyAllObserver() {
        for(Observer o: oberverList) {
            o.update();
        }
    }
}

    在写一个实体类ModeSubject,其中就一个方法changeState()模拟mode被修改状态

package com.pattern.observer;

public class ModeSubject extends Subject{
    
    public void changeState() {
        System.out.println("Mode改变状态");
        this.notifyAllObserver();
    }
}

    万事ok 就差一个主函数了

package com.pattern.observer;

public class DoMain {
    
    public static void main(String[] args) {
        
        //实例化view
        ViewObserver view = new ViewObserver();
        
        //实例化mode
        ModeSubject mode = new ModeSubject();
        
        //模拟view在mode注册
        mode.addObserver(view);
        
        //模拟mode改变状态通知view更新状态
        mode.changeState();
        
    }
}

    结果:

    Mode改变状态
    View状态更新


这只是观察者模式中的推模式,只是单纯通知所有观察者并不关心观察者需不需要。还有另外一种拉模式,相当于说你想要什么你自己拿的思想,直接把被观察者当做参数传递给观察者,由观察者自己取想要的数据。将上面代码update()方法改为update(ModeSubject mode);在做一些修改就是拉模式了。


转载于:https://my.oschina.net/u/2350616/blog/534846

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值