观察者模式

观察者模式

定义:观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监听一个主题对象。当被观察者状态发生改变时,需要通知相应的观察者,使这些观察者对象能够自动更新。

具体实现:

1.Subject(被观察的对象接口):定义一个被观察者接口,每一个被观察者都可以有多个观察者。
2.ConcreteSubject(具体被观察对象):实现了被观察者接口,如果自身状态发生改变,通知所有的观察者。
3.Observer(观察者接口): 定义一个观察者接口,内部定义一个方法,在被观察对象状态改变时会被调用。
4.ConcreteObserver(具体观察者): 实现了观察者接口,重写被观察者状态改变时调用的方法。

案例简述:我由于生意不好(被观察者),找张三,李四,王五等人(观察者)借了钱,但是呢我现在没有钱还,他们经常打电话找我要,我觉得烦,他们也觉得烦,然后我就说了,就算你们一直打电话催,我也还是没钱,这样吧,你们也别催了,等我有钱了,我通知你们来拿钱。

定义一个被观察者的接口,其中定义借钱和通知观察者的方法。

package com.sj.observerPattern;

//定义抽象被观察者
public interface Subject {
    //借钱
    void borrowMonkey(Observer moniter);
    //通知债主,我可以还钱了
    void notifyObserver(String message);
}

创建一个具体的被观察对象,实现借钱和通知的方法。

package com.sj.observerPattern;
import java.util.ArrayList;
import java.util.List;

public class ConcreteSubject implements Subject {

    //债主不止一个,用集合保存
    private List<Observer> list = new ArrayList<>();
    //我向哪些人借了钱
    @Override
    public void borrowMonkey(Observer moniter) {
        list.add(moniter);
    }
    //通知他们,我可以还钱了
    @Override
    public void notifyObserver(String message) {
        for (Observer moniter : list) {
            moniter.takeMoney(message);
        }
    }
}

抽象观察者,其中定义一个要钱的方法

package com.sj.observerPattern;

public interface Observer {
	//要钱的方法
    void takeMoney(String s);
}

具体的观察者,实现要钱方法

package com.sj.observerPattern;

public class ConcreteObserver implements Observer {
    private String name;

    private ConcreteObserver(String name) {
        this.name = name;
    }

    @Override
    public void takeMoney(String message) {
        System.out.println(name+"知道了,"+message+"。");
    }
}

定义测试类进行代码测试

package com.sj.observerPattern;

public class Test {

    public static void main(String[] args) {
    //m就代表我(被观察者)
    Subject m = new ConcreteSubject();
    //Observer代表那债主(观察者)
    Observer observer1 = new ConcreteObserver("张三");
    Observer observer2 = new ConcreteObserver("李四");
    Observer observer3 = new ConcreteObserver("王五");
    //我向哪些人借了钱
    m.borrowMonkey(observer1);
    m.borrowMonkey(observer2);
    m.borrowMonkey(observer3);
    //通知他们我可以还钱了
    m.notifyObserver("我可以还钱了");
    
    }
}
/*
	输出结果:
        张三知道了,我可以还钱了。
        李四知道了,我可以还钱了。
        王五知道了,我可以还钱了。		
*/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值