策略模式 -- 山不转水转

  对于一个在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的时候将要怎么处理,忽略怎么去匹配操作的主体问题),将这个具体的实现交给出谋划策的人。可能这样的描述还是不容易理解,但这就是策略模式,将需要执行的事交给随时可被替换的策略者。好像刘备把谋士从徐庶换成诸葛亮,做的事还是一样 -- 打仗,可是效果完全不一样?!

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

时间: 2024-08-21 17:17:35

策略模式 -- 山不转水转的相关文章

java设计模式(六)策略模式

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们可以相互替换,让算法独立于使用它的客户而独立变化,具体应用场景如第三方支付对接不同银行的算法. 要点:1)抽象策略角色    2)具体策略角色:包装相关算法和行为 3)环境角色:持有一个策略类的引用,最终给客户端调用 1.抽象策略接口 public interface SwimmingStratege { public void swimming(); } 2.具体策略角色SwimmingWithFoot public class S

设计模式(一):策略模式

一.设计背景 现实生活中,我们要做一件事情或者完成某项工作,往往有很多种途径.比如我们出游,可以选择坐汽车,坐火车,土豪点的选择是坐飞机.还有我们现在线下的支付方式也有了很多种选择,以前在外面忘了带钱的话可能一瓶水都难以买到,现在只要我们手机在身上,可以用微信或者支付宝. 在软件设计层面,我们把各种支付方式叫做策略.如果不考虑设计模式的话,我们可能会在一个类中用if..else方式来选择支付方式,即 if(type == 1){ //微信支付 }else if(type == 2){ // 支付

设计模式---策略模式Strategy Pattern

策略模式 定义:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 问题:有一个鸭子类定义了鸭子的种种行为,包括swim(),quack(),fly(),但是,并不是所有的鸭子都会飞行(fly)或者叫(quack),在这里,我们认为所有的鸭子都会浮在水面上(swim).如何实现各种不同的鸭子的不同的表现. 解决方法:第一个想到的会使继承,在鸭子父类中定义好所有的方法,在实现鸭子子类的过程中,对不满足于具体的鸭子的行为进行覆盖,但是在这种方法

设计模式@第25章:策略模式

第25章:策略模式 一.编写鸭子项目,具体要求如下: 有各种鸭子(比如 野鸭.北京鸭.水鸭等, 鸭子有各种行为,比如 叫.飞行等) 显示鸭子的信息 二.传统方案解决鸭子问题的分析和代码实现 传统的设计方案(类图) 代码实现-看老师演示 Duck 抽象类 package com.gjxaiou.strategy; public abstract class Duck { public Duck() { } public abstract void display();//显示鸭子信息 public

PHP设计模式-策略模式

<?php//策略模式//将一组特定的算法或行为 封装成一个类,以适应上下文环境 //策略的接口文件 约定策略的行为 针对一种情况 产生具体的策略interface Policy{ function showAd();} class Female implements Policy{ public function showAd() { echo __CLASS__.' policy'; }} class Male implements Policy{ public function showA

对设计模式的总结之简单工厂与策略模式

前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓,本文就说说我对本人对简单工厂模式.策略模式的见解. 简单工厂模式与策略模式 简单工厂模式 工作中,常常遇到需要做一个功能(鸭子),这个功能中含有可控个数的子操作功能(鸭子叫,鸭子跑,鸭子飞),而且子功能在不同的情况下处理方式又不相同(成年鸭子/小鸭子叫,成年鸭子/小鸭子跑,成年鸭子/小鸭子飞).我

Java 策略模式

Java 策略模式 @author ixenos 定义 1.封装算法:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换 2.分割行为和环境:对用户屏蔽内部实现,使客户端在调用算法的时候能够互不影响地互换 策略模式的实现(面向接口编程) 方法: 1.接口多态:策略模式的用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使他们之间可以相互替换 2.具体策略提供不同算法,环境负责维持和查询策略,把具体策略和环境分割开来,使得算法可以在不影响客户端和环境的情况下修改 角色分工:

设计模式之策略模式

一.概述我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆if…else…语句或者是switch…case…语句.如果该企业中不同级别的员工过多,或是对级别的调整比较频繁,那该系统就会显得复杂而脆弱.如何能将对象和算法解耦,从而使得在系统运行时能透明的改变对象的算法呢?这就到了策略模式大显身手的时候了.二.策略模式策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换.该模式可使得算法能独立于使用它的客户而变化.策

设计模式之桥梁模式和策略模式的区别

桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式.以下是它们的UML结构图. 桥梁模式: 策略模式: 在桥接模式中,Abstraction通过聚合的方式引用Implementor. 举一个例子: 策略模式:我要画圆,要实心圆,我可以用solidPen来配置,画虚线圆可以用dashedPen来配置.这是strategy模式. 桥接模式:同样是画圆,我是在windows下来画实心圆,就用windowPen+solidPen来配置,在unix下画实心圆就用uni