设计模式如何提升营销自动化业务扩展性 | 引擎篇02

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 设计模式如何提升营销自动化业务扩展性 | 引擎篇

3.1.2 模板方法模式


具体场景

在创建不同类型运营活动策略的时候,可以发现除了保存具体活动渠道配置信息不一样之外,创建过程中很多操作流程是相同的:比如保存活动基本配置信息审计日志上报创建活动审批工单创建完成后消息提醒等。


原有实践

/**
 * 短信活动类
 *
 */
@Service
public class SmsActivityStrategy{
    /**
     * 执行渠道发送
     *
     * @param msgParam msgParam
     */
    public ProcessResult createActivity(ActParam param) {
         //保存活动基础信息
         saveActBaseConfig(param);
         //保存短信活动配置
         createSmsActivity(param);
         //审计日志上报 ...
         //创建活动审批工单 ...
         //消息通知 ...
         sendNotification(param);
    }
}
/**
 * Push活动类
 *
 */
@Service
public class PushActivityStrategy{
    /**
     * 执行渠道发送
     *
     * @param msgParam msgParam
     */
    public ProcessResult createActivity(ActParam param) {
         //保存活动基础信息
         saveActBaseConfig(param);
         //保存Push活动配置
         createChannelActivity(param);
         //审计日志上报 ...
         //创建活动审批工单 ...
         //消息通知 ...
         sendNotification(param);
    }
}
...


对于每种活动策略而言,这些操作都是必需的且操作流程都是固定的,所以可以将这些操作提取成公用的流程,此时就考虑到了模板方法模式。


模式分析

GoF设计模式:可复用面向对象软件的基础模板方法模式是在一个方法中定义一个算法骨架,并将某些步骤推迟到其子类中实现。模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些步骤。


上面所指的“算法”,可以理解为业务逻辑,而‘’算法骨架“即是模板,包含‘’算法骨架“的方法就是模板方法,这也是模板方法模式名称的来源。


模板方法模式适用场景:业务逻辑由确定的步骤组成,这些步骤的顺序要是固定不变的,不同的具体业务之间某些方法或者实现可以有所不同。


实现时一般通过抽象类来定义一个逻辑模板和框架,然后将无法确定的部分抽象成抽象方法交由子类来实现,调用逻辑仍在抽象类中完成。


典型代码示例


//模板类
public abstract class AbstractTemplate {
//业务逻辑1
protected abstract void doStep1();
//业务逻辑2
protected abstract void doStep2();
//模板方法
public void templateMethod(){
     this.doStep1();
     //公共逻辑
       ......
     this.doStep2();
   }
}
//具体实现类1
public class ConcreteClass1  extends AbstractTemplate {
  //实现业务逻辑1
  protected void doStep1()
{
     //业务逻辑处理
  }
  //实现业务逻辑2
  protected void doStep2()
{
    //业务逻辑处理
   }
}
//具体实现类2
public class ConcreteClass2  extends AbstractTemplate {
  //实现业务逻辑1
  protected void doStep1()
{
     //业务逻辑处理
  }
  //实现业务逻辑2
  protected void doStep2()
{
    //业务逻辑处理
   }
}
// 调用类
public class Client {
 public static void main(String[] args)
{
    AbstractTemplate class1=new ConcreteClass1();
    AbstractTemplate class2=new ConcreteClass2();
   //调用模板方法
    class1.templateMethod();
    class2.templateMethod();
   }
}

实际代码


/**
 * 活动创建模板类
 *
 * @author chenwangrong
 */
@Slf4j
public abstract class AbstractActivityTemplate{
    /**
     * 保存具体活动配置
     *
     * @param param 活动参数
     * @return ProcessResult 处理结果
     */
    protected abstract ProcessResult createChannelActivity(ActParam param);
    /**
     * 执行活动创建
     *
     * @param msgParam msgParam
     */
    public ProcessResult createActivity(ActParam param) {
         //保存活动基础信息
         saveActBaseConfig(param);
         //保存具体渠道配置
         createChannelActivity(param);
         //审计日志上报 ...
         //消息通知 ...
    }
}
/**
 * 短信活动类
 *
 */
@Service
public class SmsActivityStrategy extends AbstractActivityTemplate{
    /**
     * 创建短信渠道活动配置
     *
     * @param msgParam msgParam
     */
    public ProcessResult createChannelActivity(ActParam param) {
         //仅需要实现:保存短信活动配置
         createSmsActivity(param);    
    }
}
(其他渠道活动类似,此处省略)
// 调用类
public class Client {
 public static void main(String[] args)
{
    AbstractActivityTemplate smsActivityStrategy=new SmsActivityStrategy();
    AbstractActivityTemplate pushActivityStrategy=new PushActivityStrategy();
    ActParam param = new ActParam();
   //调用具体活动实现类
    smsActivityStrategy.createActivity(param);
    pushActivityStrategy.createActivity(param);
   }
}

实践总结

模板方法模式有两大作用:复用和扩展。复用是指所有的子类可以复用父类中提供的模板方法的代码。扩展是指框架通过模板模式提供功能扩展点,让用户可以在不修改框架源码的情况下,基于扩展点定制化框架的功能。


模板方法非常适用于有通用业务逻辑处理流程,同时又在具体流程上存在一定差异的场景,可以通过将流程骨架抽取到模板类中,将可变的差异点设置为抽象方法,达到封装不变部分,扩展可变部分的目的。


3.1.3 策略模式


具体场景

上述我们通过模板方法模式抽取出了公共流程骨架,但这里还存在一个问题:调用类仍需要明确知道具体实现类是哪个,实例化后才可进行调用。也就是每一次增加新的渠道活动时,调用方都必须修改调用逻辑,添加新的活动实现类的初始化调用,显然不利用业务的扩展性。


在创建运营活动过程中,不同类型的活动会对应着不同的创建流程,调用方只需要根据渠道类型来进行区分,而无需理会其中具体的业务逻辑。此时策略模式是一个比较好的选择。


image.png


模式分析

在GoF《设计模式可复用面向对象软件的基础》中:策略模式定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的调用方。


典型代码示例


//策略接口定义
public interface Strategy {
    void doStrategy();
}
//策略具体实现类(多个)
public class StrategyA implements Strategy{
    @Override
    public void doStrategy() {
    }
}
//上下文操作类, 屏蔽高层模块对策略的直接访问
public class Context {
    private Strategy strategy = null;
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    public void doStrategy() {
        strategy.doStrategy();
    }
}

实际代码


/**
 * 渠道活动创建策略接口
 *
 */
public interface ActivityStrategy {
    /**
     * 创建渠道活动配置
     *
     * @param param 活动参数
     * @return 
     */
    void createActivity(ActParam param);
}
/**
 * 活动模板类
 *
 */
@Slf4j
public abstract class AbstractActivityTemplate implements ActivityStrategy {
    /**
     * 抽象方法:具体渠道活动创建
     *
     */
    protected abstract ProcessResult createChannelActivity(ActParam param);
    @Override
    public ProcessResult createActivity(ActParam param) {
         //保存活动基础信息
         saveActBaseConfig(param);
         //保存具体渠道配置
         createChannelActivity(param);
         //审计日志上报 ...
         //消息通知 ...
    }
}
/**
 * 短信推送策略具体实现类
 *
 */
@Component
public class SmsChannelActivityStrategy extends AbstractActivityTemplate {
    @Override
    public void createChannelActivity(ActParam param) {
        //保存短信配置数据
    }
}
(其他渠道活动类似,此处省略)
/**
 * 策略调用入口
 *
 */
@Slf4j
@Component
public class ActivityContext {
   @Resource
   private ActivityStrategyFactory activityStrategyFactory ;
      public void create(ActParam param) {
            //通过前面的工厂模式的代码,获取具体渠道对应的策略类
            ActivityStrategy strategy = activityStrategyFactory.getActivityStrategy(param.ChannelType);
            //执行策略
            strategy.createActivity(param);
      }
}

实际编码过程中,我们加入了ChannelActivityStrategy作为渠道活动创建策略接口,并用模板类AbstractActivityTemplate实现该接口,同时结合工厂模式创建具体策略,至此将三种模式结合了起来。


实践总结

策略模式在项目开发过程中经常用于消除复杂的if else复杂逻辑,后续如果有新的渠道活动时,只需要新增对应渠道的活动创建逻辑即可,可以十分便捷地对系统业务进行扩展。


在项目实践过程,经常会将工厂模式、模板方法模式和策略模式一起结合使用。模板方法模式进行业务流程公共骨架的抽取,策略模式进行具体子流程策略的实现和调用的封装,而工厂模式可以进行子流程策略的创建。


多种模式的结合使用可以充分发挥出各个模式的优势,达到真正提升系统设计扩展性的目的。



相关文章
|
2月前
|
人工智能 监控 搜索推荐
API如何赋能电商营销:自动化促销活动生成
在电商竞争中,API通过自动化促销活动生成,实现精准营销与高效运营,提升转化率与用户体验。
118 0
|
机器学习/深度学习 搜索推荐 算法
“会员营销API:自动化积分与优惠券,增强用户粘性”
会员营销API集积分管理、优惠券发放、用户行为追踪等功能于一体,助力企业自动化运营,降低成本并提升体验。其核心功能涵盖自动化积分系统、优惠券策略优化、数据整合与用户画像分析、跨平台体验管理,以及安全风控机制。通过实时同步积分、动态调整优惠力度和多终端数据整合,增强用户参与感与忠诚度。同时,提供效果评估工具和A/B测试接口,结合机器学习算法优化营销策略,实现精准化、高效化的会员管理与留存提升。
55 0
|
5月前
|
人工智能 算法 物联网
5G赋能工业自动化:构建未来工厂的新引擎
5G赋能工业自动化:构建未来工厂的新引擎
164 10
|
5月前
|
JSON API 开发者
python实战 | 如何利用海外代理IP,实现Facebook内容营销自动化
本文探讨了Facebook营销自动化中的挑战与解决方案。首先分析了账号风控、IP受限及手动操作效率低等问题,随后介绍了通过Python编程结合高质量海外代理IP(如青果网络)实现自动化的技术路径。内容涵盖环境配置、代理IP使用、Facebook开发者账号注册及两种自动化方法:Graph API动态发布与Selenium模拟用户操作。最后总结指出,该方案可扩展至其他平台,助力全球矩阵营销。
python实战 | 如何利用海外代理IP,实现Facebook内容营销自动化
|
5月前
|
算法 搜索推荐 大数据
数据驱动增长:大数据与营销自动化的结合之道
数据驱动增长:大数据与营销自动化的结合之道
116 3
|
12月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
12月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
178 4
|
7月前
|
机器学习/深度学习 人工智能 搜索推荐
AIGC 引擎:点燃创作自动化的未来之火
AIGC 引擎:点燃创作自动化的未来之火
|
11月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性和扩展性
【10月更文挑战第13天】 本文将探讨PHP中常见的设计模式及其在实际项目中的应用。通过对比传统编程方式,我们将展示设计模式如何有效地提高代码的可维护性和扩展性。无论是单例模式确保类的单一实例,还是观察者模式实现对象间的松耦合,每一种设计模式都为开发者提供了解决特定问题的最佳实践。阅读本文后,读者将能更好地理解和应用这些设计模式,从而提升PHP编程的效率和质量。
|
12月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性
设计模式在PHP开发中至关重要,如单例模式确保类仅有一个实例并提供全局访问点,适用于管理数据库连接或日志记录。工厂模式封装对象创建过程,降低系统耦合度;策略模式定义算法系列并使其可互换,便于实现不同算法间的切换。合理选择设计模式需基于需求分析,考虑系统架构,并通过测试驱动开发验证有效性,确保团队协作一致性和代码持续优化。设计模式能显著提升代码质量,解决开发中的设计难题。
85 8

热门文章

最新文章