大体上,分为两个,一个是发布者,另一个是订阅者,也就是publisher以及subscriber,

下面举例为顾客购买衣服,大致流程应该是这样,

顾客消费了一件衣服后,

会计收到付款,然后开具发票,

顾客凭小票去出纳那里将小票给出纳,

出纳登记后快递员送货上门

在这里,顾客担任了发布者(被观察者)这一角色,会计、出纳、快递担任了订阅者(观察者)这一角色


下面是具体的代码实现,由于java.util工具包中已经有了该设计模式的实现,我们只需继承、实现、调用即可


Customer.java


/*
* 版权信息:北京汉方三陆零科技有限公司</br>
* Copyright ?2014-2015. All rights reserved. 京ICP备15000045号
*/
package com.hanfang360.com.designpattern.observer;

import java.util.Observable;
import java.util.Observer;

/****************************************************************************
* com.hanfang360.com.designpattern.observer Customer.java Created on 2015年7月15日
* @Author: linfenliang
* @Description:
* @Version: 1.0
***************************************************************************/
public class Customer extends Observable{
// public Customer(Observer ... observers) {
// if(observers!=null){
// for(Observer o:observers){
// this.addObserver(o);
// }
// }
// }
public Customer build(Observer o){
this.addObserver(o);
return this;
}
public void custom(){
this.setChanged();
this.notifyObservers("已付款");
}

}



Accountant.java


/*
* 版权信息:北京汉方三陆零科技有限公司</br>
* Copyright ?2014-2015. All rights reserved. 京ICP备15000045号
*/
package com.hanfang360.com.designpattern.observer;

import java.util.Observable;
import java.util.Observer;

/****************************************************************************
* com.hanfang360.com.designpattern.observer Accountant.java Created on 2015年7月15日
* @Author: linfenliang
* @Description:
* @Version: 1.0
***************************************************************************/
public class Accountant implements Observer {

@Override
public void update(Observable o, Object arg) {
System.out.println(arg+"会计收到了付款,开具发票");

}


}




Cashier.java


/*
* 版权信息:北京汉方三陆零科技有限公司</br>
* Copyright ?2014-2015. All rights reserved. 京ICP备15000045号
*/
package com.hanfang360.com.designpattern.observer;

import java.util.Observable;
import java.util.Observer;

/****************************************************************************
* com.hanfang360.com.designpattern.observer Cashier.java Created on 2015年7月15日
* @Author: linfenliang
* @Description:
* @Version: 1.0
***************************************************************************/
public class Cashier implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println(arg+"我是出纳员,顾客购买信息登记入账");

}

}


DilliveryMan.java

/*
* 版权信息:北京汉方三陆零科技有限公司</br>
* Copyright ?2014-2015. All rights reserved. 京ICP备15000045号
*/
package com.hanfang360.com.designpattern.observer;

import java.util.Observable;
import java.util.Observer;

/****************************************************************************
* com.hanfang360.com.designpattern.observer DilliveryMan.java Created on
* 2015年7月15日
*
* @Author: linfenliang
* @Description:
* @Version: 1.0
***************************************************************************/
public class DilliveryMan implements Observer {

@Override
public void update(Observable o, Object arg) {
System.out.println(arg+"我是配送员,准备开始发货");

}

}


Main.java


/*
* 版权信息:北京汉方三陆零科技有限公司</br>
* Copyright ?2014-2015. All rights reserved. 京ICP备15000045号
*/
package com.hanfang360.com.designpattern.observer;
/****************************************************************************
* com.hanfang360.com.designpattern.observer Main.java Created on 2015年7月15日
* @Author: linfenliang
* @Description:
* @Version: 1.0
***************************************************************************/
public class Main {

public static void main(String[] args) {
// Customer customer = new Customer(new DilliveryMan(),new Cashier(),new Accountant());
Customer customer = new Customer().build(new DilliveryMan()).build(new Cashier()).build(new Accountant());
customer.custom();

}

}




                                                                                                                                                   

观察者模式与发布订阅还是有一定区别的,观察者模式需要一个被观察者,发布订阅模式,可以没有订阅者