首页 > 代码库 > 《大话设计模式》——读后感 (6)老板回来了,我不知道?——观察者模式之理论实例(1)

《大话设计模式》——读后感 (6)老板回来了,我不知道?——观察者模式之理论实例(1)

技术分享

技术分享

单独看UML类图,有没有发现观察者类图和工厂方法模式的类图和相似?不过代码实现可不一样哦

抽象观察者:

package com.sjmx.observer.theory;

public interface Watcher {
    
     public void update(String str);
     
}

具体观察者:

package com.sjmx.observer.theory;

public class ConcreteWatcher implements Watcher {

    @Override
    public void update(String str) {
        
        if("warning".equals(str)){
            System.out.println("检查开始,结束打扫卫生!");
        }
         
    }

}
package com.sjmx.observer.theory;

public class ConcreteWatcher2 implements Watcher {

    @Override
    public void update(String str) {
         
        if("warning".equals(str)){
            System.out.println("检查开始,结束室外活动区整理!");
        }

    }

}
package com.sjmx.observer.theory;

public class ConcreteWatcher3 implements Watcher {

    @Override
    public void update(String str) {
         
        if("warning".equals(str)){
            System.out.println("检查开始,全体安静自习!");
        }

    }

}

 

主题(通知)接口:

package com.sjmx.observer.theory;

public interface Watcher {
    
     public void update(String str);
     
}

具体通知对象:

package com.sjmx.observer.theory;

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

public class ConcreteWatched implements Watched {

    // 存放观察者
    private List<Watcher> list = new ArrayList<Watcher>();

    @Override
    public void addWatcher(Watcher watcher)
    {
        list.add(watcher);
    }

    @Override
    public void removeWatcher(Watcher watcher)
    {
        list.remove(watcher);
    }

    @Override
    public void notifyWatchers(String str)
    {
        // 自动调用实际上是主题进行调用的
        for (Watcher watcher : list)
        {
            watcher.update(str);
        }
    }

}

客户端代码:

package com.sjmx.observer.theory;

public class Client {
    
    public static void main(String[] args)
    {
        Watched girl = new ConcreteWatched();
        
        Watcher watcher1 = new ConcreteWatcher();
        Watcher watcher2 = new ConcreteWatcher2();
        Watcher watcher3 = new ConcreteWatcher3();
        
        girl.addWatcher(watcher1);
        girl.addWatcher(watcher2);
        girl.addWatcher(watcher3);
        
        girl.notifyWatchers("warning");
    }
}

运行结构:

技术分享

 

 

看完代码:

1、观察者模式所做的工作就是接触耦合,让耦合的双方都依赖于抽象,而不依赖于实体。从而使得一方的 变化不会影响另一方。

2、缺点也很容易看见的,所有的实体都要方法相同,这在显示生活中是不可能的。比如,今天放假,学生停课,工人停止生产,股票停止交易,服务业开始服务等等。

 

《大话设计模式》——读后感 (6)老板回来了,我不知道?——观察者模式之理论实例(1)