设计思想:
观察者模式定义了对象之间的一对多的依赖关系,当一个对象的状态发生改变时,所有它的依赖对象将被自动通知并更新
第一种方式,采用API提供的接口和类来实现:
网上商店中的商品在名称、价格发生变化时,必须自动通知会员,Java的API为我们提供了
Observer接口和Observable类来实现所谓观察者模式。
Observable(可观察者)类允许在自身发生改变时,通知其它对象(实现接口Observer,观察者)。
下面是一个可观察者(产品类):
import java.util.*;
public class product extends Observable{
private String name;////产品名
private float price;////价格
public String getName(){ return name;}
public void setName(String name){
this.name=name;
////设置变化点
setChanged();
notifyObservers(name);////通知观察者
}
public float getPrice(){ return price;}
public void setPrice(float price){
this.price=price;
////设置变化点
setChanged();
notifyObservers(new Float(price));
}
////以下可以是数据库更新 插入命令.
public void saveToDb(){
System.out.println("saveToDb");
}
}
下面是两个观察者:
import java.util.*;
public class NameObserver implements Observer{
private String name=null;
public void update(Observable obj,Object arg){
if (arg instanceof String){
name=(String)arg;
////产品名称改变值在name中
System.out.println("NameObserver :name changet to "+name);
}
}
}
import java.util.*;
public class PriceObserver implements Observer{
private float price=0;
public void update(Observable obj,Object arg){
if (arg instanceof Float){
price=((Float)arg).floatValue();
System.out.println("PriceObserver :price changet to "+price);
}
}
}
下面是测试类:
public class Test {
public static void main(String args[]){
Product product=new Product();
NameObserver nameobs=new NameObserver();
PriceObserver priceobs=new PriceObserver();
////加入观察者
product.addObserver(nameobs);
product.addObserver(priceobs);
product.setName("applet");
product.setPrice(9.22f);
}
}
运行结果:
C:\java>java Test
NameObserver :name changet to applet
PriceObserver :price changet to 9.22
C:\java>
第二种方式:手动写类和接口。
观察者接口代码:
package observer;
public interface Observer {
//所有观察者需要实现的方法。通知观察者的方法
public void update(String obj);
}
名称观察者,该类实现了上面的接口:
package observer;
public class NameObserver implements Observer {
public void update(String obj) {
String prefix = obj.substring(0,5);
obj = obj.substring(5);
if(prefix.equals("name:")){
System.out.println("名称改变了! 当前的名称是:"+obj);
}
}
}
价格观察者,该类实现了上面的接口:
package observer;
//观察者的实现类
public class PriceObserver implements Observer{
//观察者收到信息时需要处理的动作.
public void update(String obj) {
String prefix = obj.substring(0,6);
obj = obj.substring(6);
if(prefix.equals("price:"))
System.out.println("价格改变了!当前的价格是:"+obj);
}
}
产品类:
package observer;
import java.util.*;
public class Product {
private ArrayList obs = null;
private String price = null;
private String name = "";
public String getName() {
return name;
}
public void setName(String name) {
if(this.name != name){//价格改变的时候才通知
this.name = name;
notifyObserver("name:"+this.name);//通知所有的观察者
}
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
if(this.price != price){//价格改变的时候才通知
this.price = price;
notifyObserver("price:"+this.price);//通知所有的观察者
}
}
public Product(){
obs = new ArrayList();
}
//注册观察者
public void addObserver(Observer o){
if(!obs.contains(o))
{
obs.add(o);
}
}
//删除注册者
public void deleteObserver(Observer o){
if(obs.contains(o))
{
obs.remove(o);
}
}
//通知所有的观察者.
public void notifyObserver(String obj){
Iterator it = obs.iterator();
while(it.hasNext()){
Observer ob = (Observer) it.next();
ob.update(obj);
}
}
}
测试类:
package observer;
public class TestObserver {
/**
* 观察者测试类
*/
public static void main(String[] args) {
Product p = new Product();
Observer ob1 = new PriceObserver();
Observer ob2 = new NameObserver();
//注册观察者
p.addObserver(ob1);
p.addObserver(ob2);
//被观察者的价格改变了。
p.setPrice("98");
p.setPrice("98");//注意这行看看会不会被通知
p.setName("Dell studio 1535笔记本");
}
}
测试结果:
价格改变了!当前的价格是:98
名称改变了! 当前的名称是:Dell studio 1535笔记本
分享到:
相关推荐
java观察者设计模式demo源码
设计模式--观察者模式java例子
java实现观察者设计模式,利用ApplicationListener和ApplicationEvent。Test包里有测试代码
java 设计模式 观察者模式 简单实例 包括测试test类
主要为大家详细介绍了Java观察者设计模式,对观察者设计模式进行分析理解,感兴趣的小伙伴们可以参考一下
Java 观察者模式的浅析 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者...
设计模式之观察者模式Java版本实现和UML类设计图
java观察者模式的实例代码。从最简单的实例开始,到观察者模式。有什么问题可以加扣扣共同探讨
主要介绍了 Java观察者设计模式(Observable和Observer)的相关资料,需要的朋友可以参考下
观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化,这个例子是java内置观察者模式
详细讲解了java中的监听机制以及观察者设计模式
结合微信公众号讲解观察者模式,生动形象,关键是上手快啊
设计模式----观察者模式demo,使用java自带的工具类,实现,后面会上传一个完全自己代码实现的demo
观察者模式实例,用到java的继承,多态,加深概念理解.
设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:...
Java设计模式的观察者模式讲解,可以由浅入深了解观察者模式的应用。
设计模式:观察者模式java和javabean
章节介绍:1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之...
java常用设计模式-观察者模式
开发中常用 设计模式 开发者模式,欢迎大家学习。 博客:http://blog.csdn.net/q610098308/article/details/76143959