ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

昨天学了观察者模式 它大概是这样的

2020-10-04 08:33:31  阅读:180  来源: 互联网

标签:代码 register userId 观察者 private 大概 学了 public


听的极客设计模式,专门看了观察者模式
因为在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;
      }
}

设计模式要干的就是解耦,
创建型模式是将创建和使用代码解耦
结构型是将不同功能代码解耦
行为型(观察者模式属于行为型)模式是将不同的行为代码解耦
具体到观察者模式,它是将观察者和被观察者代码解耦.

标签:代码,register,userId,观察者,private,大概,学了,public
来源: https://www.cnblogs.com/ukzq/p/13766362.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有