随笔-159  评论-114  文章-7  trackbacks-0

模式是什么?

模式是一个范式,一个在相同环境或者状况下的一种通用解决办法,解决方案。就好像孙子兵法,对于某种特定战局,战况下的一种派兵布阵策略和实施步骤的总结。

模式需要什么呢?

模式需要一个名字,一个问题域(要解决的问题),要有一个解决的方案,最后要达到什么样的结果。

长话短说,Observer模式,所要解决的问题就是,一个事物,当它自身的状态改变了,那么它要通知其他的事物,而它又不能够事先知道要通知谁,只有在Runtime时才能知道。

举个例子吧,钟表和人的关系就是这样,钟表自身的状态,也就是时刻改变了,它通知某些人,某些人看到或者听到后,会做出不同的行为。而钟表在商店里时,并不知道要通知谁?只有买主把钟表买回家,买主的家人注册到这个钟表,这时,钟表的状态改变才会通知到家里的人,那么家人有大人、小孩,他们看到或者听到这个钟表的时间改变,会有不同的行为。

那么将上面的例子可以化解为对象。钟表是个源,它是抽象的概念,可以很多形式的表,手表、挂钟、闹钟等,而家人们都是监听器,实现了监听器接口,监听器方法就是listen()和see(),当人每个人实现了接口会有不同的行为,这些钟表并不关心,它只会在整点时通知之前注册到它内部的家人实例的监听器方法。

那是什么时候注册的呢?就是主人买回家,告诉家人这是新的钟表,也就是Timer.registerListener(Listener l)

那么钟表就是observable,就是那个常说的Subject,而家人就是具体的Observer,实现了Oberver接口的方法。

package com.javapatterns.observer;

public abstract class AbstractTimer {
    
    
public void attach(){};
    
    
public void detach(){};
    
    
void notifyObservers(){};
}

 

package com.javapatterns.observer;

import java.util.Enumeration;
import java.util.Vector;

public class ConcreteTimer extends AbstractTimer {

    
private Vector observersVector = new java.util.Vector();
    
    
public void attach(Listener observer)
    
{
        observersVector.addElement(observer);
    }

    
    
public void detach(Listener observer)
    
{
        observersVector.removeElement(observer);
    }


    
public void notifyObservers()
    
{
        Enumeration enumeration 
= observers();
        
while (enumeration.hasMoreElements())
        
{
            Listener l 
= (Listener)enumeration.nextElement();
            l.see();
            l.hear();
        }

    }



    
public Enumeration observers()
    
{
        
return ((Vector) observersVector.clone()).elements();
    }

    
}

下面是Listner接口,是一个概念模型,提供给Timer,Timer只关心,自身改变状态后,要调用的观察者什么行为,并不关心观察者本身。所以提取人的若干行为,抽象成为接口。

package com.javapatterns.observer;

public interface Listener {
    
    
void see();
    
    
void hear();

}

 

package com.javapatterns.observer;

public class Host implements Listener {
    
    
private String name;
    
    
private short age;
    
    
private String sex;
    
    
public Host(String name,short age,String sex){
        
this.name = name;
        
this.age = age;
        
this.sex = sex;        
    }


    
public void see() {
        
// TODO add see default behavior

    }


    
public void hear() {
        
// TODO add hear default behavior

    }

    
    
public void otherBehavior(){
        
    }


    
public short getAge() {
        
return age;
    }


    
public void setAge(short age) {
        
this.age = age;
    }


    
public String getName() {
        
return name;
    }


    
public String getSex() {
        
return sex;
    }


}


这是一个主人的类,也就是一类具体的Observer。

output.jpg


接口java.util.Observer和类java.util.Observable是Java本身对于观察者模式的支持。

其实这种模式就是一种回调的应用,就是想其它类中注册自己的接口,到特定时候调用自己的方法。

就好像古诗词中,“有朋自远方来不亦乐乎”,意思是说,如果好友光临到门口,叫一声自己,就会很高兴,也就是说,告诉朋友到达自己住处,这个状态满足,那么就叫一声自己,自己就会为朋友开门,高兴等行为就会进行。 如果不采用观察者模式,那就是自己需要不断的到门口察看朋友是否到了,是一种轮循的方式,当然也能达到效果,但会影响自己的事情。



posted on 2005-11-27 11:26 北国狼人的BloG 阅读(439) 评论(0)  编辑  收藏 所属分类: 达内学习总结

只有注册用户登录后才能发表评论。


网站导航: