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
- linkin大话设计模式--观察者模式
- linkin大话设计模式--单例模式
- linkin大话设计模式--代理模式
- linkin大话设计模式--命令模式
- linkin大话设计模式--策略模式
- linkin大话设计模式--门面模式
- linkin大话设计模式--桥接模式
- linkin大话设计模式--模板方法模式
- linkin大话设计模式--建造模式
- linkin大话设计模式--适配器模式
- linkin大话设计模式--常用模式总结
- linkin大话设计模式--简单工厂
- linkin大话设计模式--抽象工厂
- 大话设计-观察者模式
- 大话设计模式-观察者模式
- 大话设计模式-观察者模式
- 大话设计模式-观察者模式
- 大话设计模式-观察者模式
- lowlevel_init.S 较详细分析
- Redis源码分析(二)--结构体分析(1)
- 基于cglib实现的动态代理原理与源码解析
- 毯遣俣竞业戮奄俣寄滥负惫康腊必
- NSAssertionHandler类
- linkin大话设计模式--观察者模式
- 背包问题九讲笔记_01背包
- Linux - 进程控制 代码(C)
- 腾讯与唯品会笔试面试经历
- 哈希排序
- 【从0开始学香蕉派】序列之11:samba服务器和香蕉派的那些勾当
- Java学习笔记11:在公共类中使用访问方法而非公有域
- Golang第三天
- Two sum