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

本文介绍了策略模式的概念及其在软件设计中的应用。策略模式允许将一系列算法封装为可互换的对象,从而实现算法与客户端的解耦。通过一个具体的例子,展示了策略模式如何帮助实现灵活的行为选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 
这里写图片描述

策略模式的角色: 
1. 抽象策略角色(Strategy):策略类,通常由一个接口或者抽象类实现 
2. 具体策略角色(ConcreteStrategy):包装了相关的算法和行为 
3. 环境角色(Context):持有一个策略类的引用,最终给客户端调用


这里引用参考资料3中的例子来详细说明一下策略模式。 
“赔了夫人又折兵”——这个是《三国演义》里的著名桥段,主要是说刘备要去吴国娶孙权妹妹了,走之前诸葛亮给了赵云三个锦囊:“你保主公入吴,可一次按这三个锦囊内之计行事。”第一计:初入东吴,告知全城刘备娶孙尚香,并拜访乔国老,让吴国太施压不让刺杀刘备;第二计:刘备沉迷酒色,乐而忘返之计,骗说:“今早接孔明来报,曹操起精兵五十万,杀奔荆州而来!军情十分紧急,请主公马上回荆州!”;第三计:逃跑之时,孙夫人断后。 
1 抽象策略角色

public interface Strategy
{
    public void operate();
}
 
  • 1
  • 2
  • 3
  • 4

2 具体策略角色

class ConcreteStrategyA implements Strategy
{
    @Override
    public void operate()
    {
        System.out.println("初入东吴....#####");
    }
}

class ConcreteStrategyB implements Strategy
{
    @Override
    public void operate()
    {
        System.out.println("乐而不返....#####");
    }
}

class ConcreteStrategyC implements Strategy
{
    @Override
    public void operate()
    {
        System.out.println("腹背受敌....#####");
    }
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

3 环境角色Context

public class Context
{
    private Strategy strategy;

    public Context(Strategy strategy)
    {
        this.strategy = strategy;
    }

    public void doOperate()
    {
        this.strategy.operate();
    }
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

4 测试代码

        Context context = null;
        context = new Context(new ConcreteStrategyA());
        context.doOperate();
        context = new Context(new ConcreteStrategyB());
        context.doOperate();
        context = new Context(new ConcreteStrategyC());
        context.doOperate();
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出结果:

初入东吴....#####
乐而不返....#####
腹背受敌....#####
 
  • 1
  • 2
  • 3

策略模式和工厂模式的区别 
工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;而策略模式是行为型的,它接受已经创建好的实例,实现不同的行为。

Jdk中的策略模式: 
java.util.Comparator#compare() 
javax.servlet.http.HttpServlet 
javax.servlet.Filter#doFilter()


参考资料 
1. 《23种设计模式》 
2. 《细数JDK里的设计模式》 
3. 《java设计模式之——策略模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值