活到老,学到老

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  9 Posts :: 1 Stories :: 2 Comments :: 0 Trackbacks

    概念:观察者模式定义了一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

    举个网上商城的例子,比如很多顾客对某个商品感兴趣,把商品收藏,当该商品降价、促销、有货了等事件发生时,就会发Email通知顾客。

    
UML图如下:
    

    ItemObserver的代码如下:
    

public interface ItemObserver {
    
void
 sendNotification(String message);
}

    Customer代码如下:
    
public class Customer implements ItemObserver {
    
private
 String username;
    
private
 String email;
    
private
 String mobile;

    
public Customer(String name) throws IllegalArgumentException 
{
        
if (name == null || "".equals(name)) 
{
            
throw new IllegalArgumentException("username cannot be empty!"
);
        }

        
this.username = name;
    }


    @Override
    
public void sendNotification(String message) {
        
if (email != null && !"".equals(email.trim())) 
{
            System.out.println(
"Send Email to " +
 username);
            System.out.println(message);
        }


        
if (mobile != null && !"".equals(mobile.trim())) {
            System.out.println(
"Send SMS to " +
 username);
            System.out.println(message);
        }

    }


    
public String getUsername() {
        
return
 username;
    }


    
public void setUsername(String username) {
        
this.username =
 username;
    }


    
public String getEmail() {
        
return
 email;
    }


    
public void setEmail(String email) {
        
this.email =
 email;
    }


    
public String getMobile() {
        
return
 mobile;
    }


    
public void setMobile(String mobile) {
        
this.mobile =
 mobile;
    }


    @Override
    
public boolean equals(Object obj) {
        
if (obj == null
)
            
return false
;
        
if (obj instanceof Customer) 
{
            Customer customer 
=
 (Customer) obj;
            
return
 customer.getUsername().equals(username);
        }
 else {
            
return false
;
        }

    }


}

    ItemObservable代码如下:
    
public interface ItemObservable {
    
void
 registerItemObserver(ItemObserver itemObserver);

    
void
 removeItemObserver(ItemObserver itemObserver);

    
void
 notifyObserver(String message);
}

    Item代码如下:
    
public class Item implements ItemObservable {

    
private
 String             name;
    
private double
             price;

    
private List<ItemObserver> itemObservers = new ArrayList<ItemObserver>
();

    
public Item(String name, double price) 
{
        
this.name =
 name;
        
this.price =
 price;
    }


    @Override
    
public void registerItemObserver(ItemObserver itemObserver) {
        itemObservers.add(itemObserver);
    }


    @Override
    
public void removeItemObserver(ItemObserver itemObserver) {
        itemObservers.remove(itemObserver);
    }


    @Override
    
public void notifyObserver(String message) {
        
for (ItemObserver observer : itemObservers) 
{
            observer.sendNotification(message);
        }

    }


    
public void changePrice(double changedPrice) {
        price 
+=
 changedPrice;
        
if (changedPrice < 0
{
            notifyObserver(name 
+ " 降价了!"
);
        }

    }

    另外:Java的util包提供了Observer接口和Observable接口支持这个模式。
posted on 2011-04-07 22:29 simon.shen 阅读(309) 评论(1)  编辑  收藏 所属分类: 设计模式

Feedback

# re: 观察者模式 2011-04-08 09:25 晴天
感觉例子不是特别好~~  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: