设计模式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 }

浙公网安备 33010602011771号