• 策略模式 -- 山不转水转


      对于一个在java领域基础还还没有那么扎实的人来说,或许谈框架和设计模式对我,都显得有些好高骛远。

      但或许源于自身在工作中学习的一些坏习惯吧!我也不怎么过多地再去看算法与数据结构这样晦涩的东西。对于设计模式也仅仅是认为 --  一个程序员所必须掌握的技能之一,对吧?我的认知还是如此浅薄,至少在此。

      前一段时间,淡蓝所负责的短信接口模块与同事一起配合完成了一块所谓的“事件机制”,实际上就是通过短信的上下行做一个通讯功能,或者说跟微信公众号也差不多吧。在现实中比较常见的应用如手机付款,发送短信给你“xx先生您好,你在厦门xx分店消费的¥550元账单已发送到你的邮箱,确认请回复’Y‘”。当然上述只是我的一个设想,并非真实的场景。

      实际的业务场景

        1、商城系统推送 一封 需要回执的短信(回执:即回复短信,’TD‘(退订)……) -- 下行短信

        2、收到短信后回复对应格式的内容 -- 上行短信

        3、商城从第三方短信中间商拉取或被推送(观察者模式),获取到消费者回复的内容。根据格式判断应该执行的操作:如重置密码

      实际的技术场景

        1、系统a通过短信服务商c发送一条短信给个人b

        2、短信服务商c推送下行短信给个人b

        3、个人b收到短信运营商推送过来的短信,并根据提示回复

        4、短信服务商c获取到个人b发过来的上行消息,记录起来

        5、短信服务商c根据实际的业务支持,等待系统a主动拉取上行消息或主动推送上行消息

        6、系统a获取上行消息,并根据其内容进行业务流操作。

      ok,原谅我的表述能力,或许已经丢掉策略模式,但我们还是得回过头来看看究竟为什么要用策略模式,用在哪里?

      实际的需求是这样的,我们必须要对第三方推送的数据做一定的逻辑处理,但我们无法确定消息的推送来源。如短信、微信、邮箱等。所以我们必须坚持“面向接口编程,而非面向实现编程”的设计原则。而且我们不知道发送的将是什么内容,将要做什么操作。所以预留一个一个的接口(如回复y的时候将要怎么处理,忽略怎么去匹配操作的主体问题),将这个具体的实现交给出谋划策的人。可能这样的描述还是不容易理解,但这就是策略模式,将需要执行的事交给随时可被替换的策略者。好像刘备把谋士从徐庶换成诸葛亮,做的事还是一样 -- 打仗,可是效果完全不一样?!

      或许看客和淡蓝一样,更喜欢用代码来理解。待工作之余整理……

    ****************************************************************************************************

    ****************************************************************************************************

    2020.07.26

    最近又开始重读设计模式,感觉之前的想法比较粗浅。其实策略模式更适用于需要动态改变行为能力的业务模型

    比如说游戏,游戏角色的攻击能力,取决于武器

    不同的武器赋予角色不同的攻击方式

    重点在于我们不可能把这种变化硬编码到代码中,而需要能在系统运行(游戏进行)时候能够动态地切换人物的武器

    而我个人理解的策略模式的一大特点便是在于此,他将行为委托给第三方

    比如说我使用JPA的标准,那么我需要关心底层是用Hibernate,还是别的吗?

    应该是不用的

    那么理论上(实际上应该不会有这种操作,因为很多应用程序还是和具体的框架有关,没有完全面向接口),我可以在程序运行的期间,动态转化成另一种底层实现

  • 相关阅读:
    二叉树——数组的异或和
    二叉树——最长子数组累加和
    二叉树——平衡二叉搜索树 TreeSet, TreeMap
    二叉树——大楼的轮廓线
    数据结构--Morris遍历--二叉树的遍历
    数据结构--单调栈--烽火台
    数据结构--单调栈--求最大子矩阵的大小
    数据结构--单调栈--构造数组的MaxTree
    数据结构--单调栈结构
    字符串的压缩和解压缩
  • 原文地址:https://www.cnblogs.com/gabin/p/4496954.html
Copyright © 2020-2023  润新知