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

简介: 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 策略模式的角色: 1. 抽象策略角色(Strategy):策略类,通常由一个接口或者抽象类实现 2. 具体策略角色(ConcreteStrategy):包装了相关的算法和行为 3. 环境角色(Context):持有一个策略类的引用,最终给客户端调用这里引用参考资料3中的例子来详细说明一下策略模式。

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

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


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

public interface Strategy
{
    public void operate();
}

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("腹背受敌....#####");
    }
}

3 环境角色Context

public class Context
{
    private Strategy strategy;

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

    public void doOperate()
    {
        this.strategy.operate();
    }
}

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();

输出结果:

初入东吴....#####
乐而不返....#####
腹背受敌....#####

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

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


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

目录
相关文章
|
13天前
|
设计模式 算法 PHP
php设计模式--策略模式(六)
php设计模式--策略模式(六)
11 0
|
3月前
|
设计模式 算法 搜索推荐
设计模式之策略模式
设计模式之策略模式
41 0
|
3月前
|
设计模式 算法 Java
行为型设计模式-策略模式(Strategy Pattern)
行为型设计模式-策略模式(Strategy Pattern)
|
1月前
|
设计模式 算法
策略模式--设计模式
策略模式--设计模式
17 0
|
1月前
|
设计模式 算法 Java
【设计模式】策略模式
【设计模式】策略模式
|
3月前
|
设计模式 算法 自动驾驶
常见的设计模式(模板与方法,观察者模式,策略模式)
随着时间的推移,软件代码越来越庞大,随着而来的就是如何维护日趋庞大的软件系统。在面向对象开发出现之前,使用的是面向过程开发来设计大型的软件程序,面向过程开发将软件分成一个个单独的模块,模块之间使用函数进行组合,最后完成系统的开发,每次需要修改软件,如果不涉及好各个模块的关系,就会导致软件系统难以维护,从而导致软件变得不可使用。面向对象方法用对象模拟问题域中的实体,以对象间的联系刻画实体间联系
63 2
|
3月前
|
设计模式 算法
设计模式 | 策略模式
设计模式 | 策略模式
18 0
|
3月前
|
设计模式 算法 Go
Golang设计模式——15策略模式
Golang设计模式——15策略模式
27 0
|
3月前
|
设计模式 算法
设计模式之策略模式
设计模式之策略模式
|
3月前
|
设计模式 前端开发 算法
【设计模式】之策略模式
在前端开发中,我们经常会遇到需要根据不同的条件或情况来执行不同的算法或行为的情况。这时,策略模式就能派上用场。策略模式是一种行为型设计模式,它将不同的算法封装成独立的策略对象,使得这些算法可以互相替换,而不影响客户端代码。这种灵活性和可扩展性使得策略模式在前端开发中得到广泛应用。
46 0