zoukankan      html  css  js  c++  java
  • 昨天学了观察者模式 它大概是这样的

    听的极客设计模式,专门看了观察者模式
    因为在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);
             }
          }
      
    
  • 相关阅读:
    solaris10 服务管理
    DLL的导出导入与调用
    c# Font字体
    WaitForMultipleObjects、WaitForSingleObject、GetExitCodeThread
    solaris10补丁管理
    注册表API函数
    简单的编码加密
    asp.net 调用外部程序
    Global.cs 获取网址
    Jquery easyui dialog组件, 默认不自动打开
  • 原文地址:https://www.cnblogs.com/ukzq/p/13766362.html
Copyright © 2011-2022 走看看