走进设计模式的世界2:你知道我的全部而我却不懂你-观察者模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 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.多用组合,少用继承。

观察者模式利用“组合”将许多观察者组合进主题中。对象之前的这种关系不是通过继承产生的,

而是在运行时利用组合的方式而产生的。

猜你喜欢

转载自blog.csdn.net/qq_35165632/article/details/83542094