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


    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>

  • 相关阅读:
    2010年第二批中关村高端领军人才公示公告
    关于代理的TIPS——HTTP权威指南读书心得(九)
    Lua 集成开发环境 Decoda 开源
    boost bind使用指南
    分享:反向代理服务器的工作原理
    javascript权威指南:javascript 变量
    Json简介
    css layout/fluid03: 2 column left navigation
    css layout/fluid01: 1 column no navigation
    Typeahead (autocomplete) suggest 开发
  • 原文地址:https://www.cnblogs.com/LinkinPark/p/5233185.html
Copyright © 2020-2023  润新知