您的位置:首页 > 其它

设计模式-观察者模式应用

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

说明状态改变的时候便会通知好友状态改变,这样就实现了观察者模式的应用~.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: