本文所用代码链接:https://github.com/QandeelHaider/ObserverPattern/tree/master/src
一、观察者模式介绍
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
如何解决:使用面向对象技术,可以将这种依赖关系弱化。
二、观察者模式的实现
三、在实现产品订购功能方向的应用
1、Subject接口,带有绑定观察者到 Client 对象,从 Client 对象解绑观察者和通知观察者的方法。
1 public interface Subject { 2 3 4 public void register(Observer observer); 5 public void unregister(Observer observer); 6 public void notifyObserver(); 7 }
2、Subject接口下的Product类,有一个 ArrayList 存放观察者(即订购者)们。
1 import java.util.ArrayList; 2 3 public class Product implements Subject { 4 5 private ArrayList<Observer> observes; 6 private int iphone; 7 private String Name; 8 private boolean Available; 9 10 11 12 public Product(){ 13 observes= new ArrayList<Observer>(); 14 } 15 16 @Override 17 public void register(Observer register) { 18 observes.add(register); 19 20 } 21 22 @Override 23 public void unregister(Observer unregister) { 24 int index=observes.indexOf(unregister); 25 System.out.println("Observer : " + (index+1) + "Deleted" ); 26 observes.remove(unregister); 27 } 28 29 @Override 30 public void notifyObserver() { 31 for(Observer observer: observes){ 32 observer.update(Name); 33 } 34 35 } 36 37 public void setAvailable(boolean available){ 38 this.Available=available; 39 if(available==true){ 40 notifyObserver(); 41 } 42 } 43 44 45 46 }
3、Observer接口
1 public interface Observer { 2 3 public void update(int iphone); 4 5 }
4、Observer接口下的Customer类,订购者订购产品。
1 public class Customer implements Observer { 2 private int iphone; 3 private static int observeridcount=0; 4 private int observerid; 5 private String Name; 6 private Subject product; 7 8 public Customer(Subject product){ 9 this.product= product; 10 this.observerid=++observeridcount; 11 System.out.println("New Observer" + observerid ); 12 product.register(this); 13 } 14 15 @Override 16 public void update(int iphone) { 17 System.out.println("Iphone Available" + iphone); 18 19 } 20 21 22 }
5、程序入口
1 public class Main { 2 3 public static void main(String[] args) { 4 5 Product product = new Product(); 6 Customer customer = new Customer(product); 7 8 product.setIphone(1); 9 10 } 11 12 }
四、观察者模式在本应用中的优点
优点: 1、观察者和被观察者是抽象耦合的,产品类和订购者类封装在独立的对象中使它们可以各自独立地改变和复用。
2、建立了一套触发机制,产品对象的改变会通知到订购者们。
五、观察者模式的缺点
缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。