设计模式之观察者模式

设计模式之观察者模式

观察者模式就是多个观察者对象监视一个主题的对象,当主题对象的内部的状态发生改变时,就通知监视该主题对象的诸多的观察对象,是观察对象的状态也发生相应的改变。

观察者模式的组成:

抽象的观察角色:一般用一个接口或者抽象的类来实现,其中定义了观察者必须实现的方法。

主题角色:维护一个集合,存放所有的观察者对象的引用,可以删除观察者,可以添加观察者,如果一个对象想要成为被观察的对象,只要继承主题角色就可以了。

具体的观察角色:具体的观察角色要实现抽象的观察角色方法,以便当主题对象的内部的状态发生改变的时候,该方法被调用。

观察者模式简单地实现:(java实现):

 

 Watched类:

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
/**被观察角色即主题角色*/
public class Watched {
     private List<Watcher> watchers = new LinkedList<Watcher> ();
     private boolean changed = false ;
     public Watched () {}
     //增加观察者
     public Watched addWatcher (Watcher watcher) {
         this .watchers.add(watcher);
         return this ;
     }
     //删除观察者
     public Watched removeWatcher (Watcher watcher) {
         this .watchers.remove(watcher);
         return this ;
     }
     //删除所有
     public void removeAllWatchers () {
         this .watchers.clear();
     }
     protected void setChanged () {
         this .changed = true ;
     }
     public boolean hasChanged () {
         return this .changed;
     }
     protected void clearChanged () {
         this .changed = false ;
     }
     public int countOfWatchers () {
         return this .watchers.size();
     }
     //通知观察者
     public void notifyAllWatchers (Object ob) {
         if ( this .changed) {
             Iterator<Watcher> it = this .watchers.iterator();
             while (it.hasNext()) {
             it.next().update( this , ob);
         }
             this .clearChanged();
         }
     }
}

 

Watcher接口:

/**抽象的观察角色*/
public interface Watcher {
     public void update (Watched watched,Object ob);
}

 

Test:测试类:

public class Test {
     public static void main(String[] args) {
         //观察者对象
         Watcher student_1 = new Student ();
         Watcher student_2 = new Student ();
         Watcher student_3 = new Student ();
         //被观察的对象
         Teacher teacher = new Teacher ();
         //添加观察者
         teacher.addWatcher(student_1)
                .addWatcher(student_2)
                .addWatcher(student_3);
         //主题对象内部状态改变
         teacher.setChanged();
         //通知观察者对象
         teacher.notifyAllWatchers( "老师来了" );
     }
}
  
/**Teacher类继承了Watched,Teacher类的对象就成为一个被观察的对象*/
class Teacher extends Watched {
     public void setChanged () {
         super .setChanged();
     }
}
/**Student是观察者*/
class Student implements Watcher {
     @Override
     public void update(Watched arg0, Object message) {
         if ( null != message) {
             System.out.println(message);
         }
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值