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>