观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer
Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
如何解决:使用面向对象技术,可以将这种依赖关系弱化。 关键代码:在抽象类里有一个 ArrayList 存放观察者们。
注:以上文字引用自菜鸟教程
模式实例之网上商店
网上商店中如果商品(product)在名称(name)、价格(price)、产地(address)等方面有变化,系统能自动把变化了的信息通知会员,这将是网上商店区别传统商店的一大特色。如何设计实现? 说明你所选择的设计模式,画出类关系图(UML图)并编程实现。
//抽象观察者
public abstract class Observer {
//protected
public abstract void update();
}
import java.util.ArrayList;
public class Subject {
private ArrayList<Observer> observers = new ArrayList<Observer>();
public void increase(Observer observer){
observers.add(observer);
}
public void delete(Observer observer){
observers.remove(observer);
}
public void notifyVIP(){
for(int i=0; i<observers.size(); i++){
observers.get(i).update();
}
}
}
public class MessageObserver extends Observer {
private String name;
private String price;
private String address;
private MessageSubject messageSubject;
public MessageObserver(MessageSubject messageSubject) {
this.messageSubject = messageSubject;
}
@Override
public void update() {
name = messageSubject.getName();
price = messageSubject.getPrice();
address = messageSubject.getAddress();
System.out.println("名称变化:"+name);
System.out.println("价格变化:"+price);
System.out.println("产地变化:"+address);
}
}
public class MessageSubject extends Subject{
private String name;
private String price;
private String address;
public MessageSubject(String name,String price,String address){
this.name = name;
this.price = price;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
public class Client {
public static void main(String[] args){
MessageSubject messageSubject1 = new MessageSubject("联想笔记本", "降价", "广东");
MessageSubject messageSubject2 = new MessageSubject("懒人沙发", "未降价", "上海");
messageSubject1.increase(new MessageObserver(messageSubject1));
messageSubject2.increase(new MessageObserver(messageSubject2));
System.out.println("尊贵的会员,您之前加入购物车的商品:");
messageSubject1.notifyVIP();
System.out.println("尊贵的会员,您之前加入购物车的商品:");
messageSubject2.notifyVIP();
}
}