版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35165632/article/details/83542094
观察者模式 :
观察者模式定义了对象之间的一对多关系,当次对象改变状态或者属性时,以来他的对象都会得到通知并自动更新
解释:观察者模式主要分为两个部分:
1.主题:主题即一对多中的一,用一个接口或者类来管理和更新观察者。是可观察者(Observable)。
2.观察者:观察者即一对多中的多,与主题之间为松耦合关系,可观察者不知道观察者的细节,只知道观察者实现了观察者接口。
在使用此模式时,观察者可以从被观察者处用push和pull的方式获取数据(然而,push的方式被认为更正确)。
在使用观察患者时,不可依赖特定的通知次序。java中已经存在的观察者的实现为 Observable类(存在一定缺陷),及Observer接口。
如果使用观察者模式的灵活性不高的情况下,可以使用java自带的方式,如果需要很高的灵活性,自己去实现,这并不难。
观察者模式样例演示:你知道我的全部而我却不懂你。
/**
下面讲述的故事是来自一个花花公子哥
和他追求的一票姑娘的故事
**/
/**
公子哥接口,他要跟所有自己看的上的姑娘们群发表示自己的爱意,
他把自己公布给了所有的姑娘,但是他却对姑娘们一无所知。他只知道
那些是他喜欢的姑娘,遇见喜欢的了,就加到群发中,不喜欢了就从群发中移除。
时不时表达对所有人的爱意。
**/
public interface Observable{
// 添加要追求的姑娘到群发列表中
addObserver(Observer observer);
// 从群发列表中去除不喜欢的姑娘
delObserver(Observer observer);
// 跟追求的姑娘们求爱
notifyObserver();
// 获取自己是否只爱一个人
getLoveOnly();
// 获取自己是否有钱
getMoneyOnly();
}
/**
这是姑娘接口,他们通过公子哥发给自己的信息,去了解和分析公子哥是不是真的爱自己。
并根据公子哥的属性和做法去决定自己对公子哥的态度。
**/
public interface Observer{
// 获取公子哥最新的信息
update();
}
/**
公子哥王刚铁
**/
public class WangGangTie implements Observable{
List<Observer> observers;
// 是否单一
private boolean loveOnly;
// 是否有钱
private boolean moneyOnly;
public WangGangTie(){
this.Observer = new ArrayList<>();
this.loveOnly = false;
this.moneyOnly = true;
}
@Override
public void addObserver(Observer observer){
observers.add(observer);
}
@Override
public void delObserver(Observer observer){
int i = observers.indexOf(observer);
if(i>0){
observers.remove(i);
}
}
@Override
public void notifyObserver(){
for(Observer observer:observers){
observer.update();
}
}
@Override
public void getLoveOnly(){
return this.loveOnly;
}
@Override
public void getMoneyOnly(){
return this.moneyOnly;
}
public static void main(String[]args){
WangGangTie gangtie = new WangGangTie();
// 王钢铁对李二吖有好感,李二丫成为了王钢铁的观察者。
LiErYa li = new LiErYa(gangtie);
// 王钢铁对王美丽有好感,王美丽成为了王钢铁的观察者。
WangMeiLi wang = new WangMeiLi(wang);
// 王钢铁对俩人同时群发表示好感
gangtie.notifyObserver();
// 因为李二吖在乎的是另一半对自己是否一心一意。李二吖拒绝了。
// 因为王美丽在乎的是另一半是否有钱。王美丽同意了。
// 王钢铁觉得自己还是喜欢李二吖,所以不追求王美丽了。
gangtie.delObserver(wang);
// 王钢铁只对李二吖有好感了,又表示心意了
gangtie.notifyObserver();
gangtie.setLoveOnly(true);//懒得加方法了
// 李二丫知道王钢铁一心一意了,所以同意了。
// 王钢铁感叹你知道我的全部,而我却不懂你,只知道你是我爱的姑娘
// (可观察者只知道观察者继承了观察者接口,却不了解观察者的信息)
}
}
/**
姑娘李二吖(关注将来自己的另一半是否对自己一心一意)
**/
public class LiErYa implements Observer(){
// 自己的追求者
Observable observable;
public LiErYa(Observable observable){
this.observable = observable;
}
// 更新自己的认识
@Override
public void update(){
if(observable.getLoveOnly()){
System.out.println("答应");
}else{
System.out.println("不答应");
}
}
}
/**
姑娘王美丽(关注将来自己的另一半是否有钱)
**/
public class WangMeiLi implements Observer(){
// 自己的追求者
Observable observable;
public WangMeiLi(Observable observable){
this.observable = observable;
}
// 更新自己的认识
@Override
public void update(){
if(observable.getMoneyOnly()){
System.out.println("答应");
}else{
System.out.println("不答应");
}
}
}
观察者模式引出的设计原则
1.找出程序中会变化的方面,然后将其和固定不变的方面分离。
在观察者模式中,会改变的是主题的状态,以及观察者的数目和类型。
用这个模式,你可以依赖于主题状态的对象,却不必改变主题这就叫提前规划。
2.针对接口编程,不针对实现编程。
主题和观察者都使用接口:观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者。
这样让两者之间运作正常,又同时具有松耦合的优点。
3.多用组合,少用继承。
观察者模式利用“组合”将许多观察者组合进主题中。对象之前的这种关系不是通过继承产生的,
而是在运行时利用组合的方式而产生的。