设计模式学习9 -- 观察者模式(Observer)

 

1.   观察者模式(Observer

1.1. 概述

l         场景:网站产品价格等方面有变化,如果系统能自动通知会员,将是网上商店区别传统商店的一大特色,这就需要在商品product中加入Observer这样的角色,以便product细节发生变化时Observer能自动观察到这种变化,并能进行及时的updatenotify动作

l         一个对象发生变化,能够通知另一个对象做相应工作

l         JavaAPI还为我们提供现成的Observer接口Java.util.Observer,我们只要直接使用它就可以

l         我们的目的主要是想将值变化后通知客户的工作模块化。

1.2. 解决方法:使用Observer

//产品类,如果changePrice调用,一定要通知Customer

//目标:Product不用关心要通知谁,Customer也不用关心通知是谁发出

//Product:被观察者,Customer:观察者

import java.util.*;

class Product extends Observable{

       private String pname;

       private double price;

       public void setObserver(Observer observer){//可以用Spring注入

              this.addObserver(observer);

              }

       public Product(String pname,double price){

              this.pname = pname;

              this.price = price;

              }

       public void changePrice(double newPrice){

              this.price = newPrice;

              //通知观察者

              this.setChanged();  //设置变化点,表示要通知观察者

              this.notifyObservers("通知:价格变化了");//通知所有观察者,给一个消息

              //此时就能够自动调用观察者的update方法

              }

       }

//顾客类

class Customer implements Observer{

       private String cname;

       public Customer(String cname){

              this.cname = cname;

              }

    //参数1:来源于哪个对象,参数2:消息

       public void update(Observable o, Object arg){

              System.out.println(arg);

              }

       public void printInfo(){

              System.out.println(cname);

              }

       }

      

public class Observer1{

       public static void main(String args[]){

              Product pro = new Product("白菜",12);

              Customer cus = new Customer("张三");

              //观察者和被观察者要绑定,一个被观察者可以设置多个观察者

pro.setObserver(cus);

              pro.changePrice(13);

             

             

              }

       }

 

1.3. Observer小结

1.  编写Observable类的函数,设置变化点,唤醒Observer

2.  Observer里面编写update方法

3.  绑定,运行你要做的事情

4.  练习:编写一个Java Bean,存放帐号,密码,姓名,余额。当余额改变的时候,能够自动向数据库里面写一条历史记录。用观察者模式。

 

你可能感兴趣的:(java,设计模式,spring,工作,String,Class)