设计模式:观察者模式(Observer)

字面理解:一个对象或者多个对象同时去观察一个对象,当查看到被观察的对象发生变化的时候,观察者会发生相应的变化;或者说是 一个被观察的对象本身的数值发生变化的时候回去主动的通知监视他的对象;

例如:计算机的时间是通过网络获取,当获取的网络发生变化的时候,本地的时间显示器或者是第三方显示器会发生相应得变化,网络变化一秒,本地就变化一秒,如果不及时更新,显示器就会发生变化;

观察者之间可能会有相同的接口也可能没有,反正就是对被观察者感兴趣;

时间变化的接口:需要去监视网络时间的第三方程序需要继承这个接口:

public interface ObserveInterface {
    void update(Object time);
}

观察者:时间软件A B C:

public class TimerA implements  ObserveInterface{
    @Override
    public void update(Object obj) {
        System.out.println("A 收到时间更新");
    }
}
public class TimerB implements ObserveInterface {
    @Override
    public void update(Object obj) {
        System.out.println("B 收到时间更新");
    }
}
public class TimerC implements ObserveInterface {
    @Override
    public void update(Object obj) {
        System.out.println("C 收到时间更新");
    }
}

被观察者是网络中的时间:ObserveredTime,观察着要监听他之前需要将他注册到被观察者里面,这样ObserveredTime变化的时候才知道要去通知谁;

/**
 * 被观察着对象
 */
public class ObserveredTime {
    //记录注册的对象,方便时间变化的时候去通知改变
    List <ObserveInterface> listens= new ArrayList<>();

    private long currentTime;

    public void addObserver(ObserveInterface observeInterface) {
        listens.add(observeInterface);
    }

    public void changeTime(long changeTime) {
        setCurrentTime(changeTime);
    }

    public void setCurrentTime(long currentTime) {
        this.currentTime = currentTime;
        observerListener(currentTime);
    }

    public void observerListener(long changeTime) {
        for (ObserveInterface observeInterface : listens) {
            observeInterface.update(changeTime);
        }
    }
}

测试一下:

public class ObserverTest {
    public static void main(String[] args) {
        ObserveredTime observeredTime = new ObserveredTime();
        //观察者 A B C
        TimerA a = new TimerA();
        TimerB b = new TimerB();
        TimerC c = new TimerC();

        //注册到被观察者里面
        observeredTime.addObserver(a);
        observeredTime.addObserver(b);
        observeredTime.addObserver(c);
        observeredTime.changeTime(System.currentTimeMillis());
    }
}

测试结果:

zhou.ObserverDesign.ObserverTest
A 收到时间更新
B 收到时间更新
C 收到时间更新

Process finished with exit code 0;

 

以上就是我所理解的观察者模式,其实在目前项目中也使用过这种模式,后台上传数据,继承了更改的数据接口的类会都去监听数据,有变化就会通知;只是可能还不了解那就是“观察者模式”这样命名^.^

 

转载于:https://my.oschina.net/u/3300098/blog/1593453

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值