设计模式-观察者模式应用
2008-09-09 11:12
344 查看
这几天,仔细的看了设计模式的观察者部分,认认真真的翻看了几本书的介绍,终于对这个模式有了新的认识.主要还是说说我对它的理解和应用吧
设计模式主要还是通过抽象来实现的吧~.所以可以到处看到设计模式中不论那个模式都是带有抽象类,接口等结构的.观察者模式也不例外.观察者模式主要有参与者,具体参与者,观察者和具体观察者.
参与者主要就是被观察对象的抽象,如java.util.Observable类就是被观察对象的抽象类,它实现了观察者的增加,删除以及通知等方法.而一般都不推荐此种使用,为什么呢?因为Java使用单一继承,如果你的类已经继承了某个类,想再实现被观察的话,就不能通过继承Observable这个类来实现了.这个时候就要采取另外的做法,实现接口.接口定义观察者增加,删除,通知以及状态改变的方法,而在实现该接口的类中去实现这些方法.
在这里,主要还是说说我对这个模式的应用吧.由于是通信工程毕业,因此一直在思考网络即时通信系统,也就是类似QQ的系统了.在会员状态改变的时候,会提示某某会员已经上线,这个QQ是做的很好的~.不过,发现一个有趣的是,就是在会员离线或者状态改变的时候好象通知就不那么的及时了,不知道QQ是怎么实现的,但我觉得观察者模式在这个地方用一定是非常好的.
我构造一个Person类来表示会员类,然后每个对象就表示一个会员,为了让会员之间能够彼此通知状态改变,也是利用观察者模式实现这个功能,利用Member类同时实现参与者接口和观察者接口,这样就可以实现会员之间相互通知,即时同志好友的状态变化了~.
参与者接口为Subject, 观察者接口为Observer, 分别定义如下:
package common;
/**
* @author HUHG
*
*/
public interface Subject {
public void addObserver(Observer observer);
public void deleteObserver(Observer observer);
public void notifyObservers();
public boolean hasChanged();
}
package common;
/**
* @author HUHG
*
*/
public interface Observer {
public void update(Person person);
}
然后类Person设计如下,其中hasChanged()用来判断用户状态改变是否通知观察者,判断条件改变时可通过改变方法实现即可.代码如下:
package common;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 同一个类,实现观察者和可被观察接口
* @author HUHG
*
*/
public class Person implements Subject, Observer {
private String name= "";
private int status= 0;
private boolean isChanged= false;
private List<Observer> observerList;
/**
* @param status
*/
public Person(String name) {
super();
this.name= name;
observerList= new ArrayList<Observer>();
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the status
*/
public int getStatus() {
return status;
}
/**
* 设置对象状态,并通知观察者状态已改变
* @param status the status to set
*/
public void setStatus(int status) {
this.status = status;
if(hasChanged()){
notifyObservers();
}
}
/* (non-Javadoc)
* @see common.Observable#addObserver(java.util.Observer)
*/
public void addObserver(Observer observer) {
observerList.add(observer);
}
/* (non-Javadoc)
* @see common.Observable#deleteObserver(java.util.Observer)
*/
public void deleteObserver(Observer observer) {
observerList.remove(observer);
}
/* (non-Javadoc)
* 通知所有观察者对象状态已经改变
* @see common.Observable#notifyObsrevers()
*/
public void notifyObservers() {
Iterator<Observer> iterator= observerList.iterator();
while(iterator.hasNext()){
Observer observer= iterator.next();
observer.update(this);
}
}
/* (non-Javadoc)
* 输出显示被观察对象状态已经改变
* @see common.Observer#update(common.Person)
*/
public void update(Person person) {
System.out.println("Name: "+ name);
System.out.println("Friend: "+ person.getName()+ " Status has changed! Now status is "+ person.getStatus());
}
/* (non-Javadoc)
* 确定是否需要通知观察者状态已改变
* @see common.Subject#hasChanged()
*/
public boolean hasChanged() {
// TODO Auto-generated method stub
if(this.getStatus()== 1){
this.isChanged= true;
}
return isChanged;
}
}
这样所需要的代码就实现了,然后运行测试是否能正确运行.测试类如下:
package common;
/**
* @author HUHG
*
*/
public class TestStatus {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person John= new Person("John");
Person Lily= new Person("Lily");
Person Lucy= new Person("Lucy");
John.addObserver(Lily);
Lucy.addObserver(Lily);
John.setStatus(1);
Lucy.setStatus(1);
}
}
运行,输出如下:
Name: Lily
Friend: John Status has changed! Now status is 1
Name: Lily
Friend: Lucy Status has changed! Now status is 1
说明状态改变的时候便会通知好友状态改变,这样就实现了观察者模式的应用~.
设计模式主要还是通过抽象来实现的吧~.所以可以到处看到设计模式中不论那个模式都是带有抽象类,接口等结构的.观察者模式也不例外.观察者模式主要有参与者,具体参与者,观察者和具体观察者.
参与者主要就是被观察对象的抽象,如java.util.Observable类就是被观察对象的抽象类,它实现了观察者的增加,删除以及通知等方法.而一般都不推荐此种使用,为什么呢?因为Java使用单一继承,如果你的类已经继承了某个类,想再实现被观察的话,就不能通过继承Observable这个类来实现了.这个时候就要采取另外的做法,实现接口.接口定义观察者增加,删除,通知以及状态改变的方法,而在实现该接口的类中去实现这些方法.
在这里,主要还是说说我对这个模式的应用吧.由于是通信工程毕业,因此一直在思考网络即时通信系统,也就是类似QQ的系统了.在会员状态改变的时候,会提示某某会员已经上线,这个QQ是做的很好的~.不过,发现一个有趣的是,就是在会员离线或者状态改变的时候好象通知就不那么的及时了,不知道QQ是怎么实现的,但我觉得观察者模式在这个地方用一定是非常好的.
我构造一个Person类来表示会员类,然后每个对象就表示一个会员,为了让会员之间能够彼此通知状态改变,也是利用观察者模式实现这个功能,利用Member类同时实现参与者接口和观察者接口,这样就可以实现会员之间相互通知,即时同志好友的状态变化了~.
参与者接口为Subject, 观察者接口为Observer, 分别定义如下:
package common;
/**
* @author HUHG
*
*/
public interface Subject {
public void addObserver(Observer observer);
public void deleteObserver(Observer observer);
public void notifyObservers();
public boolean hasChanged();
}
package common;
/**
* @author HUHG
*
*/
public interface Observer {
public void update(Person person);
}
然后类Person设计如下,其中hasChanged()用来判断用户状态改变是否通知观察者,判断条件改变时可通过改变方法实现即可.代码如下:
package common;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 同一个类,实现观察者和可被观察接口
* @author HUHG
*
*/
public class Person implements Subject, Observer {
private String name= "";
private int status= 0;
private boolean isChanged= false;
private List<Observer> observerList;
/**
* @param status
*/
public Person(String name) {
super();
this.name= name;
observerList= new ArrayList<Observer>();
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the status
*/
public int getStatus() {
return status;
}
/**
* 设置对象状态,并通知观察者状态已改变
* @param status the status to set
*/
public void setStatus(int status) {
this.status = status;
if(hasChanged()){
notifyObservers();
}
}
/* (non-Javadoc)
* @see common.Observable#addObserver(java.util.Observer)
*/
public void addObserver(Observer observer) {
observerList.add(observer);
}
/* (non-Javadoc)
* @see common.Observable#deleteObserver(java.util.Observer)
*/
public void deleteObserver(Observer observer) {
observerList.remove(observer);
}
/* (non-Javadoc)
* 通知所有观察者对象状态已经改变
* @see common.Observable#notifyObsrevers()
*/
public void notifyObservers() {
Iterator<Observer> iterator= observerList.iterator();
while(iterator.hasNext()){
Observer observer= iterator.next();
observer.update(this);
}
}
/* (non-Javadoc)
* 输出显示被观察对象状态已经改变
* @see common.Observer#update(common.Person)
*/
public void update(Person person) {
System.out.println("Name: "+ name);
System.out.println("Friend: "+ person.getName()+ " Status has changed! Now status is "+ person.getStatus());
}
/* (non-Javadoc)
* 确定是否需要通知观察者状态已改变
* @see common.Subject#hasChanged()
*/
public boolean hasChanged() {
// TODO Auto-generated method stub
if(this.getStatus()== 1){
this.isChanged= true;
}
return isChanged;
}
}
这样所需要的代码就实现了,然后运行测试是否能正确运行.测试类如下:
package common;
/**
* @author HUHG
*
*/
public class TestStatus {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person John= new Person("John");
Person Lily= new Person("Lily");
Person Lucy= new Person("Lucy");
John.addObserver(Lily);
Lucy.addObserver(Lily);
John.setStatus(1);
Lucy.setStatus(1);
}
}
运行,输出如下:
Name: Lily
Friend: John Status has changed! Now status is 1
Name: Lily
Friend: Lucy Status has changed! Now status is 1
说明状态改变的时候便会通知好友状态改变,这样就实现了观察者模式的应用~.
相关文章推荐
- 设计模式之观察者与动态代理的结合应用
- C# 通过 Observer观察者 设计模式 来理解 抽象类 和 接口 应用在什么地方
- (C#)设计模式 之 观察者模式 (经典应用:猫叫,烧开水)
- 设计模式——观察者模式:气象监测应用
- 设计模式在游戏开发中的应用之观察者模式
- 设计模式应用与发展之观察者模式(java)
- (转)设计模式之观察者模式在ListView中的应用
- 简析设计模式之观察者模式的实际应用
- js设计模式之观察者模式的应用
- 浅学设计模式之观察者<Observer>模式及在android中的应用
- 设计模式在游戏中的应用--观察者模式(十)
- Java设计模式之观察者模式的应用--简单的事件通知工具
- Android设计模式应用---观察者模式
- 浅学设计模式之观察者<Observer>模式及在android中的应用
- 设计模式之观察者模式在Listview中的应用
- 面向对象程序设计(OOP设计模式)-行为型模式之观察者模式的应用与实现
- 设计模式实战应用之二:观察者模式
- java设计模式--观察者模式应用场景
- Unity中设计模式应用(二):结合中介者模式的观察者模式
- php设计模式之观察者模式的应用详解