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>

linkin大话设计模式--观察者模式_第1张图片

你可能感兴趣的:(linkin大话设计模式--观察者模式)