0
点赞
收藏
分享

微信扫一扫

设计模式-观察者模式备忘 #yyds干货盘点#

定义

观察者模式又被叫做发布订阅模式,在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。

解决问题

将观察者和被观察者代码解耦。

应用场景

当一个对象状态的改变需要改变其他对象, 或实际对象是事先未知的或动态变化的时, 可使用观察者模式。

 当应用中的一些对象必须观察其他对象时, 可使用该模式。 但仅能在有限时间内或特定情况下使用。

举个栗子

注册成功之后需要执行的后续操作越来越多,那 register() 函数的逻辑会变得越来越复杂,也就影响到代码的可读性和可维护性。

public interface RegObserver {
void handleRegSuccess(long userId);
}

public class RegPromotionObserver implements RegObserver {
// 依赖注入
private PromotionService promotionService;

@Override
public void handleRegSuccess(long userId) {
promotionService.issueNewUserExperienceCash(userId);
}
}

public class RegNotificationObserver implements RegObserver {
private NotificationService notificationService;

@Override
public void handleRegSuccess(long userId) {
notificationService.sendInboxMessage(userId, "......");
}
}


public class UserController {
// 依赖注入
private UserService userService;
private List<RegObserver> regObservers = new ArrayList<>();

// 设置好之后也不可修改
public void setRegObservers(List<RegObserver> observers) {
regObservers.addAll(observers);
}


public Long register(String telephone, String password) {
//省略输入参数的校验代码
long userId = userService.register(telephone, password);

for (RegObserver observer : regObservers) {
observer.handleRegSuccess(userId);
}

return userId;
}
}


  不同的应用场景和需求下,这个模式也有截然不同的实现方式,有同步阻塞的实现方式,也有异步非阻塞的实现方式;有进程内的实现方式,也有跨进程的实现方式。


  设计模式要干的事情就是解耦,创建型模式是将创建和使用代码解耦,结构型模式是将不同功能代码解耦,行为型模式是将不同的行为代码解耦,具体到观察者模式,它将观察者和被观察者代码解耦。借助设计模式,我们利用更好的代码结构,将一大坨代码拆分成职责更单一的小类,让其满足开闭原则、高内聚低耦合等特性,以此来控制和应对代码的复杂性,提高代码的可扩展性。


  观察者模式的应用场景非常广泛,小到代码层面的解耦,大到架构层面的系统解耦,再或者一些产品的设计思路,都有这种模式的影子,比如,邮件订阅、RSS Feeds,本质上都是观察者模式。不同的应用场景和需求下,这个模式也有截然不同的实现方式,有同步阻塞的实现方式,也有异步非阻塞的实现方式;有进程内的实现方式,也有跨进程的实现方式。


举报

相关推荐

0 条评论