设计模式:观察者(Observer)模式
一、前言
观察者模式其实最好的名称应该是“发布订阅”模式,和我们现在大数据之中的发布订阅方式比较类似,但是也有区别的地方,在上一个设计模式,我们学习的是仲裁者模式,其中当控件的状态发生改变的时候就会向仲裁者发出信息,让仲裁者进行仲裁,这其实和发布订阅非常的类似,但是用处是不一样的,仲裁者模式是用来解除复杂对象之间的相互调用的关系,从而独立出来进行开发,而观察者模式是在被观察者状态改变的时候被动的被唤醒进行相应的处理,两者的实现比较类似,比如都是被动唤醒的,但是思想和用处是不一样的,被唤醒之后的处理是不一样的。
二、代码
首先我们自己实现观察者模式,其次我们使用java已经实现好的观察者接口,然后来对比一下两者的不同。
2.1、自己实现观察者模式
NumberGenerator 类:
1 package zyr.dp.observer; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 6 public abstract class NumberGenerator { 7 8 private ArrayList observers=new ArrayList(); 9 10 public void add(Observer observer){ 11 observers.add(observer); 12 } 13 public void remove(Observer observer){ 14 observers.remove(observer); 15 } 16 public void notifyObserver(){ 17 Iterator it=observers.iterator(); 18 while(it.hasNext()){ 19 Observer object=(Observer)it.next(); 20 object.update(this); 21 } 22 } 23 public abstract void execuate(); 24 public abstract int getNumber(); 25 }
RandomNumberGenerator 类:
1 package zyr.dp.observer; 2 3 import java.util.Random; 4 5 public class RandomNumberGenerator extends NumberGenerator { 6 7 private Random random=new Random(); 8 private int number; 9 public int getNumber(){ 10 return number; 11 } 12 public void execuate() { 13 for(int i=0;i<20;i++){ 14 number=random.nextInt(60); 15 notifyObserver(); 16 } 17 } 18 19 }
Observer接口:
1 package zyr.dp.observer; 2 3 public interface Observer { 4 public abstract void update(NumberGenerator object); 5 }
DigitalObserver类:
1 package zyr.dp.observer; 2 3 public class DigitalObserver implements Observer { 4 5 public void update(NumberGenerator object) { 6 System.out.println("DigitalObserver:"+object.getNumber()); 7 try { 8 Thread.sleep(100); 9 } catch (InterruptedException e) { 10 e.printStackTrace(); 11 } 12 } 13 14 }
GraphObserver类:
1 package zyr.dp.observer; 2 3 public class GraphObserver implements Observer { 4 5 public void update(NumberGenerator object) { 6 System.out.print("GraphObserver:"); 7 for(int i=0;i<object.getNumber();i++){ 8 System.out.print("*"); 9 try { 10 Thread.sleep(100); 11 } catch (InterruptedException e) { 12 e.printStackTrace(); 13 } 14 } 15 System.out.println(); 16 } 17 18 }
Main类:
1 package zyr.dp.observer; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 NumberGenerator numberGenerator=new RandomNumberGenerator(); 7 numberGenerator.add(new DigitalObserver()); 8 numberGenerator.add(new GraphObserver()); 9 10 numberGenerator.execuate(); 11 } 12 13 }
运行结果:
DigitalObserver:20 GraphObserver:******************** DigitalObserver:56 GraphObserver:******************************************************** DigitalObserver:11 GraphObserver:*********** DigitalObserver:52 GraphObserver:**************************************************** DigitalObserver:54 GraphObserver:****************************************************** DigitalObserver:41 GraphObserver:***************************************** DigitalObserver:39 GraphObserver:*************************************** DigitalObserver:14 GraphObserver:************** DigitalObserver:18 GraphObserver:****************** DigitalObserver:35 GraphObserver:*********************************** DigitalObserver:40 GraphObserver:**************************************** DigitalObserver:3 GraphObserver:*** DigitalObserver:0 GraphObserver: DigitalObserver:43 GraphObserver:******************************************* DigitalObserver:29 GraphObserver:***************************** DigitalObserver:2 GraphObserver:** DigitalObserver:48 GraphObserver:************************************************ DigitalObserver:0 GraphObserver: DigitalObserver:48 GraphObserver:************************************************ DigitalObserver:40 GraphObserver:****************************************