关键词搜索

源码搜索 ×
×

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

发布2016-04-25浏览6827次

详情内容


欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


欢迎跳转到本文的原文链接:https://honeypps.com/design_pattern/strategy/

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

策略模式的角色:

  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("腹背受敌....#####");
        }
    }
    
      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();
        }
    }
    
      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();
    
      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设计模式之——策略模式

    欢迎跳转到本文的原文链接:https://honeypps.com/design_pattern/strategy/

    欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载