观察者设计模式

来源:互联网 发布:网络侵犯名誉权案例 编辑:程序博客网 时间:2024/04/28 14:43

         观察者是 JDK中使用最多的模式之一。他可以做到消息的订阅和传递。

      比如现在现实生活中的牛奶公司 他的模式就是一个观察者模式,只要你是他们的订户你就会收到牛奶。这个时候牛奶公司就是发布者    订户就是观察者。订户可以取消订阅。具体的代码实现

       先定义 2个接口

                 观察者类 SubJect   ,订阅者类Observer

/** * 观察者模式 * @author Administrator * */public interface SubJect {/** * 订阅牛奶 */void  registerObserver(Observer  observer);    /** * 取消订阅 */void unRegisterObserver(Observer  observer);/** * 派送牛奶 */void notifyObserver(Milk milk);}

/** * 订户 * @author Administrator * */public interface Observer {void  receive(Milk milk);}


再实现具体的类

import java.util.HashSet;import java.util.Set;/** * 牛奶公司 * @author Administrator * */public class MilkCompany  implements  SubJect{private  Set<Observer>   obs;public MilkCompany(){obs=new HashSet<Observer>();}public void registerObserver(Observer  observer) {obs.add(observer);}public void unRegisterObserver(Observer  observer) {obs.remove(observer);}public void notifyObserver(Milk milk) {for (Observer ob : obs) {  ob.receive(milk);}}}

/** * 订户 * @author Administrator * */public class Subscriber implements Observer{private String name;    public  Subscriber(String name)    {    this.name=name;    }public void receive(Milk milk) {System.out.println("接受到牛奶"+name);}}

main

import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class Test {/** * @param args */public static void main(String[] args) {      MilkCompany milkCompany=new MilkCompany();      Subscriber  ss=   new Subscriber("张三");      milkCompany.registerObserver(ss);      milkCompany.registerObserver(new Subscriber("李四"));      milkCompany.registerObserver(new Subscriber("王五"));      Milk milk=new Milk();milk.setName("xxx");      milkCompany.notifyObserver(milk);}}
运行结果

接受到牛奶张三
接受到牛奶李四
接受到牛奶王五




总结:

  二对象之间松耦合,但是它们任然可以实现交互,不清楚彼此的细节,观察者模式提供了一种对象设计 让发布者和订阅者之间松耦合。

0 0
原创粉丝点击