设计模式之观察者模式

一、详细介绍

        观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。

        观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
        观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

二、举例实现

        实现观察者模式的时候需要注意,观察者与被观察者对象之间的互动关系不能体现成类之间的直接调用关系,否则就将观察者与被观察者之间紧密的耦合起来,从根本上违反面向对象的设计原则。无论是观察者“观察”观察对象,还是被观察者将自己的改变“通知”观察者,都不应该直接调用。应该通过一种注册回调的形式来实现观察者模式。观察者往往是需要实现某个接口的,被观察者保存着这些被注册的观察者的信息(用List、Set等集合保存观察者对象),一旦发生变化则通过多态回调观察者接口的方法,从而达到低耦合的目的。

import java.util.HashSet;

//观察者模式

interface Observer{//观察者接口
	public void update(Product p);//被观察者有更新时调用的
	public void unreg(Product p);//撤销注册
}

class WebObserver implements Observer{//Web观察者
	@Override
	public void update(Product p) {//回调方法
		System.out.println("New price: " + p.getName() + ":" + p.getPrice());
	}
	@Override
	public void unreg(Product p) {//撤销注册
		p.getObservers().remove(this);
	}	
}

class MailObserver implements Observer{//邮箱观察者
	@Override
	public void update(Product p) {
		System.out.println("Send this message: " + p.getName() + ":" + p.getPrice());
	}
	@Override
	public void unreg(Product p) {
		p.getObservers().remove(this);
	}	
}

class Product{//产品类,被观察者
	private double price; //价格
	private String name;  //商品名称
	private HashSet<Observer> observers;//保存所有观察者
	public Product(String name, double price){//构造方法
		this.price = price;
		this.name = name;
		observers = new HashSet<Observer>();
	}
	public void addObserver(Observer obs){//添加观察者
		observers.add(obs);
	}
	public void notifyObserver(){//通知观察者执行update()方法
		for(Observer obs : observers)
			obs.update(this);
	}
	public double getPrice(){
		return price;
	}
	public void setPrice(double price){
		this.price = price;
		notifyObserver();//当价格变动时通知观察者
	}
	public String getName(){
		return name;
	}
	public void setName(String name){
		this.name = name;
	}
	public HashSet<Observer> getObservers(){
		return observers;
	}
	public void setObservers(HashSet<Observer> observers){
		this.observers = observers;
	}
}

public class ObserverPattern {
	public static void main(String[] args) {
		Product p = new Product("《设计模式》", 100);//创建一个产品
		Observer o1= new WebObserver();   //创建第一个观察者
		Observer o2 = new MailObserver(); //创建第二个观察者
		
		p.addObserver(o1); //添加观察者
		p.addObserver(o2); //添加观察者
		
		System.out.println("===第一次价格变动===");
		p.setPrice(80);
		o1.unreg(p);
		
		System.out.println("===第二次价格变动===");
		p.setPrice(75);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值