美文网首页
设计模式之——策略模式

设计模式之——策略模式

作者: 齐舞647 | 来源:发表于2017-06-01 20:39 被阅读26次

前言:
本文仅作为第一次学习设计模式的参考和笔记。
初探策略模式:

策略模式:Strategy Pattern


又名:政策模式(Policy Pattern)。

原话:Define a family of algorithms , encapsulate each one , and make them interchangeable.
直译:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。

1. 定义:一组算法继承同一接口,可以在需求下,进行互换。
2. 示例类图:
策略模式类图
3. 示例代码:
//抽象的策略角色:
instance Strategy{
    //策略模式的运算法则
    public void doSomeThing();
}

//具体策略角色:
class ConcreteStrategy1 implements Strategy {
    public void doSomeThing{
        //具体策略1的运算法则
    }
}
class ConcreteStrategy2 implements Strategy {
    public void doSomeThing{
        //具体策略2的运算法则
    }
}

//封装角色
class Context {
    //抽象策略
    private Strategy strategy = null;
    //构造函数设置具体策略
    public Context(Strategy _strategy){
        this.strategy = _strategy;
    }
    //封装后的策略方法
    public void doSomeThing(){
        this.strategy.doSomeThing();
    }
}

public class Client {
    public static void main(String[] args){
        //声明一个具体的策略
        Strategy strategy = new ConcreteStrategy1();
        //声明上下文对象
        Context context = new Context(strategy);
        //执行封装后的方法
        context.doSomeThing();
    }
}
4. 优点:
  • 算法可以自由切换
  • 避免使用多重条件判断
  • 拓展性好:添加一个策略直接实现接口,其他完全不用修改。
5. 缺点:
  • 策略类数量增多:复用性小
  • 所有的策略类都要对外暴露(用工厂模式/代理模式可以解决这个缺点)
6. 使用场景:
  • 多个类只有在算法或行为上稍有不同的场景
  • 算法需要自由切换的场景
  • 需要屏蔽算法规则的场景
7. 扩展:策略枚举
//策略枚举:
enum Calculator{
    //加法运算
    ADD("+"){
        public int exec(int a,int b){
            return a+b;
        }
    },
    //减法运算
    SUB("-"){
        public int exec(int a,int b){
            return a-b;
        }
    };
    String value = "";
    //定义成员值类型
    private Calculator(String _value){
        this.value = _value;
    }
    //获得枚举成员的值
    private String getValue(){
        return this.value;
    }
    //声明一个抽象函数
    public abstract int exec(int a , int b);
}

public class Client{
    public static void main(String[] args){
        //输入的两个参数是数字
        int a = Integer.parseInt(args[0]);
        String symbol = args[1];    //符号
        int b = Integer.parseInt(args[2]);
        System.out.println("输出的参数为:"+Arrays.toString(args));
        System.out.println("运算结果为:"+a+symbol+b+"="+Calculator.ADD.exec(a,b));
    }
}

相关文章

  • PHP设计模式之策略模式

    PHP设计模式之策略模式

  • PHP设计模式之策略模式

    PHP设计模式之策略模式

  • 简说设计模式之策略模式

    前言:对于设计模式基础概念可以去看[简说设计模式之设计模式概述] 一、什么是策略模式 策略(Strategy)模式...

  • 策略模式

    参考资料:漫话:如何给女朋友解释什么是策略模式? 设计模式之策略模式(实例+Demo) Java设计模式(8)——...

  • 学习Head First设计模式Day1

    Java设计模式之设计模式 策略模式:策略模式定义了算法簇,分别封装起来,让他们之间可以互相替换,此设计模式让算法...

  • 策略模式 2018-11-04

    设计模式之策略模式 官方说明设计模式的3个角色: 环境角色:context , 持有一个策略的引用 抽象策略角色,...

  • Java设计模式——策略模式

    Java设计模式之策略模式 这期分享的模式是策略模式是程序设计中最常用的了,因为开发工作中总是会使用到策略模式。 ...

  • 策略模式

    本文参考自: 《JAVA设计模式》之策略模式(Strategy) 1. 作用 策略模式属于对象的行为模式。其用意是...

  • 设计模式(Swift) - 单例模式、备忘录模式和策略模式

    设计模式(Swift) - 单例模式、备忘录模式和策略模式 设计模式(Swift) - 单例模式、备忘录模式和策略模式

  • 设计模式之策略模式总结

    再上一篇文章《设计模式之策略模式》中,我们通过模拟鸭子项目,了解了什么是策略模式,怎么使用策略模式。本文将通过鸭子...

网友评论

      本文标题:设计模式之——策略模式

      本文链接:https://www.haomeiwen.com/subject/gonefxtx.html