设计模式01观察者模式(java)

先发代码,有空来写内容。

observer1

 1 import java.util.Observer;
 2 import java.util.Observable;
 3 
 4 //学生类(Student)继承Observable后变得可以被观察
 5 class Student extends Observable{
 6     //属性
 7     private String name;
 8     private boolean isSleep = false;
 9     private boolean isLate = false;
10     //构造函数
11     public Student(){}
12     public Student(String name){
13         this.name = name;
14     }
15     //睡觉行为
16     public void sleep(){
17         System.out.println(name + " is sleeping");
18         isSleep = true;
19         setChanged();
20         notifyObservers();
21         
22     }
23     public String toString(){
24         return name;
25     }
26 }
27 //教师类(Teacher)实现Observer接口成为观察者
28 class Teacher implements Observer{
29     @Override
30     public void update(Observable o,Object arg){
31             System.out.println("teacher: "+o+",wakeup!wakeup!");
32     }
33 }
34 //班主任类(ClassHead)实现Observer接口成为观察者
35 class ClassHead implements Observer{
36     @Override
37     public void update(Observable o,Object arg){
38             System.out.println("classHead: "+o+",cleanTheRoomAfterSchool");
39     }
40 }
41 public class ObserverDemo{
42     public static void main(String[] arguments){
43         Student tom = new Student("Tom");
44         tom.addObserver(new ClassHead());
45         tom.addObserver(new Teacher());
46 
47         System.out.println("有 "+tom.countObservers()+" 个观察者在观察Tom");
48         tom.sleep();
49         
50     }
51 }

 

 

observer2

import java.util.Map;
import java.util.HashMap;
import java.util.Observer;
import java.util.Observable;

//学生类(Student)继承Observable后变得可以被观察
class Student extends Observable{
    //属性
    private String name;
    private boolean isSleep = false;
    private boolean isLate = false;
    //构造函数
    public Student(){}
    public Student(String name){
        this.name = name;
    }
    //睡觉行为
    public void sleep(){
        System.out.println(name + " is sleeping");
        isSleep = true;
        setChanged();
        notifyObservers("sleep");
        
    }
    //迟到行为
    public void late(){
        System.out.println(name + " was lated");
        isLate = true;
        setChanged();
        notifyObservers("late");
    }
    public String toString(){
        return name;
    }
}
//教师类(Teacher)实现Observer接口成为观察者
class Teacher implements Observer{
    //参数arg作为key,该参数触发的回应作为value存储在Map中
    private Map<String,String> info = new HashMap<String,String>();
    public Teacher(){
        info.put("sleep",",wakeup!wakeup!");
        info.put("late",",come in.");
    }
    //添加键值对
    public boolean addSay(String k,String v){
        return info.put(k,v)==null?false:true;
    }
    @Override
    public void update(Observable o,Object arg){
            String say = info.get(arg);
            if(say == null){
                return;
            }
            System.out.println("teacher: "+o+say);
    }
}
//班主任类(ClassHead)实现Observer接口成为观察者
class ClassHead implements Observer{
    private Map<String,String> info = new HashMap<String,String>();
    public ClassHead(){
        info.put("sleep",",goOutWashBaFace");
        info.put("late",",cleanTheRoom!");
    }
    public boolean addSay(String k,String v){
        return info.put(k,v)==null?false:true;
    }
    @Override
    public void update(Observable o,Object arg){
            String say = info.get(arg);
            if(say == null){
                return;
            }
            System.out.println("classHead: "+o+say);
    }
}
public class ObserverDemo{
    public static void main(String[] arguments){
        Student tom = new Student("Tom");
        tom.addObserver(new ClassHead());
        tom.addObserver(new Teacher());

        System.out.println("有 "+tom.countObservers()+" 个观察者在观察Tom");
        tom.sleep();
        tom.late();
    }
}

 Observer与Obvsevable实现

 1 import java.util.List;
 2 import java.util.ArrayList;
 3 import java.util.Iterator;
 4 //定义observer接口
 5 interface observer{
 6     public void update(observable o,Object arg);
 7 }
 8 //定义observable类
 9 class observable{
10     //isChanged记录实例是否改变
11     private boolean isChanged;
12     //obsers存储观察者集合
13     private List<observer> obsers;
14     //构造函数初始化实例
15     public observable(){
16         isChanged = false;
17         obsers = new ArrayList<observer>();
18     }
19     //设置是否发生变化为false
20     protected void clearChanged(){
21         isChanged = false;
22     }
23     //设置是否发生变化为true
24     public void setChanged(){
25         isChanged = true;
26     }
27     //返回对象是否发生改变
28     public boolean hasChanged(){
29         return isChanged;
30     }
31     //添加观察者
32     public void addObserver(observer o){
33         obsers.add(o);
34     }
35     //删除指定观察者
36     public void deleteObserver(observer o){
37         obsers.remove(o);
38     }
39     //清空所有观察者
40     public void deleteObservers(){
41         obsers.clear();
42     }
43     //返回观察者数量
44     public int countObservers(){
45         return obsers.size();
46     }
47     
48     //如果对象发生改变就通知所有观察者,然后将变化状态设置为false
49     public void notifyObservers(){
50         notifyObservers(new Object());
51     }
52     public void notifyObservers(Object arg){
53         if(!hasChanged())
54             return;
55         Iterator it = obsers.iterator();
56         while(it.hasNext()){
57             ((observer)(it.next())).update(this,arg);
58         }
59         clearChanged();
60     }
61 }

 

posted @ 2016-10-17 22:59  handsome1  阅读(264)  评论(0)    收藏  举报