當需要上層對底層的操作的時候,可以使用觀察者模式實現向上協作。也就是上層響應
底層的事件,但這個事件的執行代碼由上層提供。
1、意圖:
定義對象一對多的依賴關係,當一個對象發生變化的時候,所有依賴它的對象都得到通
知並且被自動更新。
2、結構
傳統的觀察者模式結構如下。
3,舉例:
// PaymentEvent.java 傳入資料的類
import java.util.*;
public class PaymentEvent extends EventObject {
private String Text; //定義 Text 內部變數
//建構函式
public PaymentEvent(Object source,String Text) {
super(source);
this.Text=Text; //接收從外部傳入的變數
}
public String getText(){
return Text; //讓外部方法擷取使用者輸入字串
}
}
//監聽器介面
//PaymentListener.java
import java.util.*;
public interface PaymentListener extends EventListener {
public String Action(PaymentEvent e);
}
// Payment.java 平台類
import java.util.*;
public class Payment{
private double amount;
public double getAmount(){
return amount;
}
public void set(double value){
amount = value;
}
//事件編程
private ArrayList elv; //事件偵聽列表對象
//增加事件事件接聽程式
public void addPaymentListener(PaymentListener m) {
//如果表是空的,先建立它的對象
if (elv==null){
elv=new ArrayList();
}
//如果這個偵聽不存在,則添加它
if (!elv.contains(m)){
elv.add(m);
}
}
//刪除事件接聽程式
public void removePaymentListener(PaymentListener m) {
if (elv!= null && elv.contains(m)) {
elv.remove(m);
}
}
//點火 ReadText 方法
protected String fireAction(PaymentEvent e) {
String m=e.getText();
if (elv != null) {
//啟用每一個接聽程式的 WriteTextEvett 事件
for (int i = 0; i < elv.size(); i++) {
PaymentListener s=(PaymentListener)elv.get(i);
m+=s.Action(e);
}
}
return m;
}
public String goSale(){
String x = "不變的流程一 ";
PaymentEvent m=new PaymentEvent(this,x);
x = fireAction(m); //可變的流
x += amount + ", 正在查詢庫存狀態"; //屬性和不變的流程二
return x;
}
}
調用:Test.java
import java.util.*;
public class Test {
//入口
public static void main(String[] args) {
Payment o1 = new Payment();
Payment o2 = new Payment();
Payment o3 = new Payment();
o1.addPaymentListener(new PaymentListener(){
public String Action(PaymentEvent e){
return e.getText()+" 現金支付 ";
}
});
o2.addPaymentListener(new PaymentListener(){
public String Action(PaymentEvent e){
return e.getText()+" 信用卡支付 ";
}
});
o3.addPaymentListener(new PaymentListener(){
public String Action(PaymentEvent e){
return e.getText()+" 支票支付 ";
}
});
o1.set(777);
o2.set(777);
o3.set(777);
System.out.println(o1.goSale());
System.out.println(o2.goSale());
System.out.println(o3.goSale());
}
}