java 观察者模式

                                                                    观察者模式
  Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Observer(观察者)模式是比较常用的一个模式.
  比如网上商店的产品价格发生了改变,需要向注册用户发送e-mail或者短信时,就可以用到Observer设计模式。
  在此写了6个java类来描述说明Observer设计模式;
  1、Observer.java  观察者接口
  2、EmailSendObserver.java 邮差观察者
  3、SMSSendObserver.java 短信发送观察者
  4、Observable.java 被观察者基类
  5、Product.java 被观察者(商品)
  6、Test.java 带有main方法的测试类

 

=================================    1 Observer.java   ===============================
public interface Observer {
  void update(Observable o, Object arg);
}
=================================       1 end          ================================

========================                2 EmailSendObserver.java      ==========================
public class EmailSendObserver implements Observer {
 
  //通过构造器的方式给Product注入邮件发送观察者
  public EmailSendObserver(Product product) {
    product.addObserver(this);
  }

  public void update(Observable product, Object arg) {
    // TODO Auto-generated method stub
    System.out.println("Product price has been changed to "
        + ((Product)product).getPrice()
        + " ;\n\t\t The notify e-mail has sent to all client.");   
  }
}
=============================          2 end             =================================

=========================      3 SMSSendObserver.java  ==============================
public class SMSSendObserver implements Observer {
 
  //通过构造器的方式给Product注入短消息发送观察者
  public SMSSendObserver(Product product) {
    product.addObserver(this);
  }

  public void update(Observable product, Object arg) {
    // TODO Auto-generated method stub
    System.out.println("Product price has been changed to "
        + ((Product)product).getPrice()
        + " ;\n\t\t The notify SMS has sent to all client.");   
  }
}
=============================          3 end           ==================================

==========================       4 Observable.java   ==================================
public class Observable {
  //state
  private boolean changed = false;

  //observer collection
  private List<Observer> observers;

  public Observable() {
    observers = new ArrayList<Observer>(0);
  }

  //attach a oberver
  public synchronized void addObserver(Observer o) {
    if (o == null)
      throw new NullPointerException();
    if (!observers.contains(o)) {
      observers.add(o);
    }
  }
 
  //detach a oberver
  public synchronized void deleteObserver(Observer o) {
    observers.remove(o);
  }

  //trigger all observers attached to this object observer to work
  public void notifyObservers() {
    notifyObservers(null);
  }

  //trigger all observers attached to this object observer to work
  public void notifyObservers(Object arg) {
    synchronized (this) {
      if (!changed)
        return;
      clearChanged();
    }
   
    for (Observer observer : observers) {
      observer.update(this, arg);
    }
  }

  //Clears the observer list so that this object no longer has any observers.
  public synchronized void deleteObservers() {
    observers.clear();
  }

  //Marks this Observable object as having been changed;
  protected synchronized void setChanged() {
    changed = true;
  }

  //Indicates that this object has no longer changed, or that it has already
  //notified all of its observers of its most recent change
  protected synchronized void clearChanged() {
    changed = false;
  }

  public synchronized boolean hasChanged() {
    return changed;
  }

  public synchronized int countObservers() {
    return observers.size();
  }
}
=============================         4 end            =============================

=============================   5 Product.java     =============================
public class Product extends Observable {
  //构造器
  private Product(){}
  //构造器
  public Product(float price){
    this.price = price;
  }
 
  //商品价格
  private float price;

  //改变商品价格
  public void changePrice(float price) {
    if (this.price != price) {
      this.price = price;
      setChanged();
    }
    notifyObservers();
  }

  public float getPrice() {
    return price;
  }
  public void setPrice(float price) {
    this.price = price;
  }
}
==========================       5 end      ======================================

========================     6 Test.java     ======================================
public class Test {
  public static void main(String[] args) {
    //new product
    Product product = new Product(1000);
    //email observer
    new EmailSendObserver(product);
    //sms observer
    new SMSSendObserver(product);
    //chage price of product
    product.changePrice(800);
  }
}
===========================       6 end        ====================================

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java观察者模式是一种常见的设计模式,用于在对象之间建立一对多的依赖关系[^1]。在该模式中,有一个主题(被观察者)和多个观察者。当主题的状态发生变化时,它会通知所有的观察者进行相应的更新。 下面是一个Java观察者模式的示例代码: ```java // 定义观察者接口 public interface Observer { void update(); } // 定义具体的观察者类 public class ConcreteObserver implements Observer { private int observerState; private ConcreteSubject subject; public ConcreteObserver(ConcreteSubject subject) { this.subject = subject; this.subject.registerObserver(this); } @Override public void update() { observerState = subject.getState(); System.out.println("Observer state updated: " + observerState); } } // 定义主题接口 public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); } // 定义具体的主题类 public class ConcreteSubject implements Subject { private int state; private List<Observer> observers = new ArrayList<>(); public int getState() { return state; } public void setState(int state) { this.state = state; notifyObservers(); } @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(); } } } // 使用观察者模式 public class Main { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); ConcreteObserver observer1 = new ConcreteObserver(subject); ConcreteObserver observer2 = new ConcreteObserver(subject); subject.setState(10); // 输出: // Observer state updated: 10 // Observer state updated: 10 subject.setState(20); // 输出: // Observer state updated: 20 // Observer state updated: 20 } } ``` 在上面的示例中,`ConcreteSubject`是具体的主题类,它维护了一个观察者列表,并在自身状态发生变化时通知所有观察者进行更新。`ConcreteObserver`是具体的观察者类,它实现了`Observer`接口,并在`update`方法中更新自己的状态。 使用观察者模式可以实现对象之间的松耦合,当一个对象的状态发生变化时,不需要直接调用其他对象的方法,而是通过观察者模式来通知其他对象进行更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值