定义
- 观察者模式是行为型设计模式。
- 对象订阅者与观察者之间存在一对多的关系,当订阅者对象发送改变时,观察者能感知这种变化做出相应的事件。
自定义代码实现
- 这里用订阅者是店铺,观察者是两个喜欢苹果和华为的用户。通过店铺不同进货的产品,用户产生不同的响应事件。
- 创建一个订阅者对象。
public class AppleShop {
private String apple = "还没有商品。。。";
private List<UserBuy> list;
public AppleShop() {
list = Lists.newArrayList();
}
public void setApple(String apple) {
this.apple = apple;
info();
}
public String getApple() {
return this.apple;
}
public void setUserBuy(UserBuy userBuy) {
this.list.add(userBuy);
}
public void info() {
list.forEach(o -> o.buyApple());
}
}
public interface UserBuy {
void buyApple();
}
public class UsUser implements UserBuy {
private AppleShop appleShop;
public UsUser(AppleShop appleShop) {
this.appleShop = appleShop;
}
@Override
public void buyApple() {
if ("苹果".equals(appleShop.getApple())) {
System.err.println("我是UsUser 店铺有苹果了,我喜欢。。。");
} else {
System.err.println("我是UsUser 店铺没有苹果,我不买。。。");
}
}
}
public class ChinaUser implements UserBuy {
private AppleShop appleShop;
public ChinaUser(AppleShop appleShop) {
super();
this.appleShop = appleShop;
}
@Override
public void buyApple() {
if ("华为".equals(appleShop.getApple())) {
System.err.println("我是ChinaUser 店铺有华为了,我喜欢。。。");
} else {
System.err.println("我是ChinaUser 店铺没有华为,我不买。。。");
}
}
}
public class TestObserved {
public static void main(String[] args) {
shopObserved();
}
private static void shopObserved() {
AppleShop appleShop = new AppleShop();
UserBuy usUser = new UsUser(appleShop);
UserBuy chainUser = new ChinaUser(appleShop);
appleShop.setUserBuy(usUser);
appleShop.setUserBuy(chainUser);
while (true) {
Scanner scanner = new Scanner(System.in);
appleShop.setApple(scanner.nextLine());
}
}
}

使用spring自带的观察者模式实现
- 在spring的核心板rt.jar里有可以帮助我们事件观察者模式的类和接口。

- 我们只需要继承订阅者类和实现观察者接口即可完成该设计模式的编写。
public class Subscription extends Observable {
public Subscription() {
super();
}
@Override
public void addObserver(Observer o) {
super.addObserver(o);
}
public void deleteObserver(ObservedU o) {
super.deleteObserver(o);
}
@Override
public void notifyObservers() {
super.setChanged();
super.notifyObservers();
}
}
public class ObservedU implements Observer {
public ObservedU(Subscription subscription) {
subscription.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
if ("苹果".equals(arg)) {
System.err.println("我是观察者U 店铺有苹果了,我喜欢。。。");
} else {
System.err.println("我是观察者U 店铺没有苹果,我不买。。。");
}
}
}
public class ObservedC implements Observer {
public ObservedC(Subscription subscription) {
subscription.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
if ("华为".equals(arg)) {
System.err.println("我是观察者C 店铺有华为了,我喜欢。。。");
} else {
System.err.println("我是观察者C 店铺没有华为,我不买。。。");
}
}
}
public class TestObserved {
public static void main(String[] args) {
observed();
}
private static void observed() {
Subscription subscription = new Subscription();
new ObservedU(subscription);
new ObservedC(subscription);
while (true) {
Scanner scanner = new Scanner(System.in);
subscription.notifyObservers(scanner.nextLine());
}
}

实际使用场景
- 在java.util.EventListener和javax.servlet.http.HttpSessionBindingListener和 javax.servlet.http.HttpSessionAttributeListener等等都有观察者设计模式的应用。
- 减低对象间的耦合度,改变订阅者或观察者对其他没有影响。
- 以上代码demo主要是用于展示观察者设计模式的基本原理,在项目中的使用还需根据实际场景和业务需求进行完善和改动。
- 最后虚心学习,共同进步 -_-