zoukankan      html  css  js  c++  java
  • 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>

  • 相关阅读:
    Oracle判断对象是否存在sql语句
    Reporting Services 4: Web Service
    C#的16位和32位MD5加密
    龙的传人Xml_javascript分页
    龙的传人——xml_javascript三级联动
    SAE学习笔记1
    java方法重载
    jquery easyui时间微调器
    django支持ajax的post方法
    easyui插件显示问题
  • 原文地址:https://www.cnblogs.com/LinkinPark/p/5233185.html
Copyright © 2011-2022 走看看