这几天,仔细的看了设计模式的观察者部分,认认真真的翻看了几本书的介绍,终于对这个模式有了新的认识.主要还是说说我对它的理解和应用吧
设计模式主要还是通过抽象来实现的吧~.所以可以到处看到设计模式中不论那个模式都是带有抽象类,接口等结构的.观察者模式也不例外.观察者模式主要有参与者,具体参与者,观察者和具体观察者.
参与者主要就是被观察对象的抽象,如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
说明状态改变的时候便会通知好友状态改变,这样就实现了观察者模式的应用~.