目录

文章目录

一、策略模式是什么?

二、使用步骤

1.实例简介

2.实例代码

适用场景

总结


一、策略模式是什么?

  • 1)开闭原则(Open Closed Principle)是编程中 最基础、最重要的设计原则
  • 2) 一个软件实体如类,模块和函数应该 对扩展开放( 对提供方),对 修改关闭( 对使用方)。用抽象构建框架,用实现扩展细节。
  • 3) 当软件需要变化时,尽量 通过扩展软件实体的行为来实现变化,而不是 通过修改已有的代码来实现变化。
  • 4) 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。
  • 5)策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。

二、使用步骤

1.实例简介

有这么一个订单处理系统,对接了不同的商家平台,有淘宝的订单,拼多多的订单,京东的订单,

系统接收到这些订单之后,要进行不同的处理,可以使用策略模式进行实现

2.实例代码

创建策略的接口类,定义了两个抽象方法,一个是设定订单来源的平台,一个是订单处理。

package com.example.demo.strategy;

public interface OrderSourceStrategy {

    //订单来源平台
    public String orderSource();

    //订单处理内容
    public void setOrder();

}

 创建不同平台的实现类

 拼多多的实现类

package com.example.demo.strategy.impl;

import com.example.demo.strategy.OrderSourceStrategy;
import org.springframework.stereotype.Component;

/**
 * @author linaibo
 * @version 1.0
 * Create by 2022/11/19 13:25
 */
@Component
public class PinduoduoStrategy implements OrderSourceStrategy {
    @Override
    public String orderSource() {
        return "PDD";
    }

    @Override
    public void setOrder() {
        System.out.println("PDD");
    }
}

 淘宝的实现类

package com.example.demo.strategy.impl;

import com.example.demo.strategy.OrderSourceStrategy;
import org.springframework.stereotype.Component;

/**
 * @author linaibo
 * @version 1.0
 * Create by 2022/11/19 13:22
 */
@Component
public class TaobaoStrategy implements OrderSourceStrategy {

    @Override
    public String orderSource() {
        return "TAOBAO";
    }

    @Override
    public void setOrder() {
        System.out.println("TAOBAO");
    }
}

  天猫的实现类

package com.example.demo.strategy.impl;

import com.example.demo.strategy.OrderSourceStrategy;
import org.springframework.stereotype.Component;

/**
 * @author linaibo
 * @version 1.0
 * Create by 2022/11/19 13:24
 */
@Component
public class TianmaoStrategy implements OrderSourceStrategy {
    @Override
    public String orderSource() {
        return "TIANMAO";
    }

    @Override
    public void setOrder() {
        System.out.println("TIAOMAO");
    }
}

 创建一个helper类将这些策略初始化到一个map对象中,使用Autowired将容器中的实现类设定到map对象中

package com.example.demo.strategy;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author linaibo
 * @version 1.0
 * Create by 2022/11/19 13:26
 */
@Service
public class OrderSourceStrategyHelper {

    private Map<String, OrderSourceStrategy> strategyMap;

    @Autowired
    public void setStrategyMap(List<OrderSourceStrategy> list) {
        System.out.println(list);
        strategyMap = list.stream().collect(Collectors.toMap(item -> item.orderSource(), item -> item, (v1, v2) -> v1));
        System.out.println(strategyMap);
    }

    public OrderSourceStrategy getStratrgy(String orderSource) {
        OrderSourceStrategy orderSourceStrategy = strategyMap.get(orderSource);
        return orderSourceStrategy;
    }

}

也可以通过创建环境类的方式,参照下面的博客

调用

@Test
    public void getStrategy(){
        String pinduoduo = "PDD";
        OrderSourceStrategy stratrgy = orderSourceStrategyHelper.getStratrgy(pinduoduo);
        stratrgy.setOrder();
    }

适用场景

如果在一个系统里面有许多类,它们之间的区别仅在于它们 的行为,那么使用策略模式可以动态地让一个对象在许多行 为中选择一种行为。
一个系统需要动态地在几种算法中选择一种。
如果一个对象有很多的行为,如果不用恰当的模式,这些行 为就只好使用多重的条件选择语句来实现。
不希望客户端知道复杂的、与算法相关的数据结构,在具体 策略类中封装算法和相关的数据结构,提高算法的保密性与 安全性。
在我们生活中比较常见的应用模式有:

1、电商网站支付方式,一般分为银联、微信、支付宝,可以采用策略模式
2、电商网站活动方式,一般分为满减送、限时折扣、包邮活动,拼团等可以采用策略模式

总结

在策略模式中定义了一系列算法,将每一个算法封装起来,并让它们 可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为 政策模式。策略模式是一种对象行为型模式。

• 策略模式包含三个角色:环境类在解决某个问题时可以采用多种策略, 在环境类中维护一个对抽象策略类的引用实例;抽象策略类为所支持 的算法声明了抽象方法,是所有策略类的父类;具体策略类实现了在 抽象策略类中定义的算法。

• 策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派 给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的 策略类里面,作为一个抽象策略类的子类。

• 策略模式主要优点在于对“开闭原则”的完美支持,在不修改原有系 统的基础上可以更换算法或者增加新的算法,它很好地管理算法族, 提高了代码的复用性,是一种替换继承,避免多重条件转移语句的 实现方式;其缺点在于客户端必须知道所有的策略类,并理解其区 别,同时在一定程度上增加了系统中类的个数,可能会存在很多策 略类。

• 策略模式适用情况包括:在一个系统里面有许多类,它们之间的区 别仅在于它们的行为,使用策略模式可以动态地让一个对象在许多 行为中选择一种行为;一个系统需要动态地在几种算法中选择一种; 避免使用难以维护的多重条件选择语句;希望在具体策略类中封装 算法和与相关的数据结构。