关于架构设计之Java的观察者模式(结合代码解释)

很多时候都需要需要写一个观察者模式,public class Observable extends Object{},l类似这样的一个观察者对象,表示我们想要观察的对象Obeservable,一个对象就可以有一个或者多个观察者,观察者可以实现Observable接口的任意对象,当Observable实例改变之后,程序里调用了Observable的notifyObservable方法的程序,通过调用update方法来通知Observable实例发生改变。Observable将会按照其注册的重要顺序来告诉观察者(Observers),从而使用非固定顺序的在单独的线程发送通知。
顺序通知
注意,此通知机制与线程无关,并且与 Object 类的 wait 和 notify 机制完全独立。
新创建一个 observable 对象时,其观察者集是空的。当且仅当 equals 方法为两个观察者返回 true 时,才认为它们是相同的。

构造方法摘要
Observable()
构造一个带有零个观察者的 Observable。
方法摘要
void addObserver(Observer o)
如果观察者与集合中已有的观察者不同,则向对象的观察者集中添加此观察者。
protected void clearChanged()
指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以 hasChanged 方法将返回 false。
int countObservers()
返回 Observable 对象的观察者数目。
void deleteObserver(Observer o)
从对象的观察者集合中删除某个观察者。
void deleteObservers()
清除观察者列表,使此对象不再有任何观察者。
boolean hasChanged()
测试对象是否改变。
void notifyObservers()
如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。
void notifyObservers(Object arg)
如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。
protected void setChanged()
标记此 Observable 对象为已改变的对象;现在 hasChanged 方法将返回 true。

public interface Observer
一个可在观察者要得到 observable 对象更改通知时可实现 Observer 接口的类。

方法摘要
void update(Observable o, Object arg)
只要改变了 observable 对象就调用此方法。

2.实例

//观察者1

public class SmtpObserver implements Observer
{
	@Override
	public void update(Observable o, Object arg)
	{
		System.out.println(arg.toString());
	}
} 
 
//观察者2
public class Pop3Observer implements Observer
{
	@Override
	public void update(Observable o, Object arg)
	{
		System.out.println(arg.toString());
	}
}
 
//主体 被观察者
public class Subject extends Observable{   
       
    /**  
     * 业务方法,一旦执行某个操作,则通知观察者  
     */  
    public void doBusiness(){   
        if (true) {   
            super.setChanged();   
        }   
        notifyObservers("hello");   
    }   
  
    public static void main(String [] args) {   
        //创建一个被观察者   
        Subject subject = new Subject();   
           
        //创建两个观察者   
        Observer smtpObserver = new SmtpObserver();   
        Observer pop3Observer = new Pop3Observer();   
           
        //把两个观察者加到被观察者列表中   
        subject.addObserver(smtpObserver);   
        subject.addObserver(pop3Observer);   
           
        //执行业务操作   
        subject.doBusiness();   
    }   
}  

发布了5 篇原创文章 · 获赞 8 · 访问量 170

猜你喜欢

转载自blog.csdn.net/qq_44761063/article/details/104497042