听的极客设计模式,专门看了观察者模式
因为在Reactive Programming中也是使用了观察者模式
比如说在用户注册成功后,发送一条注册成功短信息给其邮箱,再加一条广告(或者其他什么服务)
那在代码里是比较耦合的
如下:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private PromotionService promotionService;
@PostMapping("/register")
public Long register(String telephone,String password){
//省略校验代码,try-catch等
long userId = userService.register(telephone,password);
promotionService.sendWelcomeMessage(userId);
return userId;
}
}
虽然代码违反了单一职责原则,但是如果没有扩展和修改需求的话,是可以接受的
相反,如果需求频繁变动,如,除了发送欢迎信息,还要发送一条广告,一些体验金等
那就需要频繁修改register中的代码,违反了开闭原则.
如果后续操作更多,那么register改得会更多,逻辑更复杂,执行效率更慢,也影响到了代码的可读性和维护性
这个时候,就可以使用观察者模式了
如下:
//一个Observer,即观察者,这里观察着当注册成功后的事件
public interface RegObserver{
void handleRegSuccess(long userId);
}
@Service
public class RegMessageObserver implements RegObserver{
@Autowired
private MessageService messageService;
@Override
public void handleRegSuccess(long userId){
//发送设定好的欢迎消息
messageService.sendWelcomeMessage(userId);
}
}
@Service
public class RegInformalObserver implements RegObserver{
@Autowired
private InformalService informalService;
public void handleRegSuccess(long userId){
//发送体验金
informalService.sendExperienceCash(userId);
}
}
@RequestMapping("/api/user")
public class UserController{
@Autowired
private UserSerivce userService;
private List<RegObserver> regObservers = new ArrayList<>();
//一次性设置好,之后也不可能动态的修改
@Autowired
public void setRegObservers(List<RegObserver> observers){
regObservers.addAll(observers);
}
@PostMapping("/register")
public Long register(String telephone,String password){
//省略一些代码(校验参数,异常抓取)
long userId = userService.register(telephone,password);
for(RegObserver observer : regObservers){
observer.handleRegSuccess(userId);
}
return userId;
}
}
设计模式要干的就是解耦,
创建型模式是将创建和使用代码解耦
结构型是将不同功能代码解耦
行为型(观察者模式属于行为型)模式是将不同的行为代码解耦
具体到观察者模式,它是将观察者和被观察者代码解耦.
:PS
如果传入一个boolean表示该用户是否是新用户,或者是否需要进行handle操作.
if(registerNewUser){
for(RegObserver observer : regObservers){
observer.handleRegSuccess(userId);
}
}