当需要上层对底层的操作的时候,可以使用观察者模式实现向上协作。也就是上层响应
底层的事件,但这个事件的执行代码由上层提供。
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());
}
}
阅读(1727) | 评论(0) | 转发(0) |