linkin大话设计模式--观察者模式

来源:互联网 发布:制作试卷的软件 编辑:程序博客网 时间:2024/05/29 11:17

linkin大话设计模式--观察者模式

观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题。当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自动更新。


在观察者模式中,被观察的对象常常也被称为目标和主题,依赖的对象被称为观察者。

代码如下:

<strong><span style="font-size:14px;">import java.util.ArrayList;import java.util.Iterator;import java.util.List;import javax.swing.JFrame;import javax.swing.JLabel;public class Product extends ObServable{    //定义2个属性    private String name;    private double price;        public Product(){            }        public Product(String name, double price) {        super();        this.name = name;        this.price = price;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;        notifyObServer(name);    }    public double getPrice() {        return price;    }    public void setPrice(double price) {        this.price = price;        notifyObServer(price);    }        public static void main(String[] args) {        //创建一个被观察者        Product product = new Product("电视机",250);        //创建2个观察者 观察2个属性        NameObServer nameObServer = new NameObServer();        PriceObServer priceObServer = new PriceObServer();        //在被观察者对象上注册这个观察者        product.registObServer(nameObServer);        product.registObServer(priceObServer);        product.setName("电脑");        product.setPrice(1L);        product.setName("手机");        product.setPrice(2L);    }    }//被观察者的抽象父类abstract class ObServable{    List<ObServer> obServers = new ArrayList<ObServer>();        public void registObServer(ObServer o){        obServers.add(o);    }        public void removeObServer(ObServer o){        obServers.remove(o);    }        public void notifyObServer(Object value){        for(Iterator it = obServers.iterator();it.hasNext();){            ObServer o = (ObServer) it.next();            o.update(this, value);        }    }}//观察者接口interface ObServer{    public void update(ObServable o,Object arg);}//下面提供2个观察者接口的实现 一个用来观察Product对象的name属性,一个用来观察Product对象的price属性class NameObServer implements ObServer{    @Override    public void update(ObServable o, Object arg) {        if(arg instanceof String){            String name = (String) arg;            JFrame f = new JFrame("观察者");            JLabel j = new JLabel("名称改变为:"+name);            f.add(j);            f.pack();            f.setVisible(true);            System.out.println(NameObServer.class.getName()+"观察者:"+o+"物品的名称已经变为:"+name);        }else{            System.out.println(NameObServer.class.getName()+"类型不对,这里把这个逻辑过滤...");        }    }}class PriceObServer implements ObServer{    @Override    public void update(ObServable o, Object arg) {        if(arg instanceof Double){            System.out.println(PriceObServer.class.getName()+"观察者:"+o+"物品的价格已经变为:"+arg);        }else{            System.out.println(PriceObServer.class.getName()+"类型不对,这里把这个逻辑过滤...");        }    }    }</span></strong>

0 0
原创粉丝点击