策略模式笔记

定义

策略模式是一个在可以在运行时选择算法行为的设计模式。

策略模式:

  • 定义了一个算法族
  • 封装每个算法
  • 族内的算法可以相互替换

此模式让算法的变化独立于使用算法的客户。使用策略模式时,我们可以通过输入数据、数据的类型或者其他可以识别的因素来选择不同的算法,这些因素我们直到运行时才能获取到。

比如不同的薪资有不同的个人所得税算法,购物时花费不同的价格有不同的优惠策略,交税在不同国家有不同的计算方法等等。我们可以定义一系列对应的策略算法,之后通过个人薪资、花费的价格、所在的地区,选择对应的策略进行计算。

使用

定义一个策略接口和几个实现此接口的类,客户端持有一个策略接口,在运行时根据输入数据等信息选择对应的具题策略赋值给接口,之后执行策略接口的方法(即对应的具体实现类中实现的方法)。

对于不熟悉上面UML的可以阅读深入浅出UML类图看懂UML类图和时序图了解一下。

代码(Java)

// 策略接口
public interface Strategy {
    void execute();
}
?
// 具体策略类A
public class ConcreteStrategyA implements Strategy {
    @Override
    public void execute() {
        System.out.println("This is ConcreteStrategyA");
    }
}
?
// 具体策略类B
public class ConcreteStrategyB implements Strategy {
    @Override
    public void execute() {
        System.out.println("This is ConcreteStrategyB");
    }
}
?
// 用户类
public class Context {
    private Strategy strategy;
?
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
?
    public Strategy getStrategy() {
        return strategy;
    }
?
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
?
    // 用户方法,执行具体赋值的策略的计算方法
    public void execute() {
        System.out.println("context execute");
        strategy.execute();
    }
?
    public static void main(String[] args) {
        Context context = new Context(new ConcreteStrategyA());
        context.execute();
?
        // 可以根据输入的数据等信息进行判断,设置对应的具体策略来执行
        context.setStrategy(new ConcreteStrategyB());
        context.execute();
    }
}

总结

策略模式主要是找出应用中可能需要变化之处,把它们独立出来进行封装,不和那些不需要变化的代码混在一起。

这样可以独立出最小的部分来进行复用,避免了有很多的将易变和不变部分混合在一起的实现类,导致出现重复代码的情况。

同时策略模式符合开-闭原则,对扩展开发,对修改关闭,当有新的策略出现的时候,只要添加一个对应的继承策略接口的具体类即可,不需修改其他策略。

时间: 2024-08-09 10:42:57

策略模式笔记的相关文章

Head First Design Pattern 读书笔记(1) 策略模式

Head First Design Pattern 读书笔记(1) Strategy Pattern 策略模式 这几天为了锻炼看英语文档的能力,开着有道硬着头皮看 <Head First Desgin Pattern>的原版书,顺便做下笔记,把里面提到的每个模式通过回忆的方式画出来复习并记下来总结下学习成果=.= 关于设计模式 使用设计模式是为了增强程序的复用性,拓展性,易维护性. 设计模式会增加程序代码的复杂度,并不是所有情况都必须使用设计模式,需要根据需求以及经验评估使用场景. 学习并掌握

head first 设计模式读书笔记 之 策略模式

作为一个php开发者,深知曾经很多程序员都鄙视php,为什么呢?因为他们认为php的语法是dirty的,并且由于开发者水平参差不齐导致php的代码更加乱上加乱,维护起来简直一坨shit一样.随着php加入了面向对象的阵型之后,很多开发者开始使用了oop思想来写代码,php也变得越来越标准,越来越规范.而其中,设计模式起到了不小的作用.最近老大找我谈话,说php这边的开发模块耦合度过高,代码感觉质量不高,想来一次代码重构行动.我对代码重构也是一知半解,而代码重构的基础就是去了解设计模式,于是我翻起

大话设计模式读书笔记2——策略模式

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合. UML 图: 根据<大话设计模式>——第二章 商场促销这个案例代码来简单的记录一下策略模式的使用方式: /// <summary> /// 现金收费抽象类 /// </summary> public abstract class CashSuper { /// <summary> ///

设计模式笔记:状态模式&amp;策略模式

这几天一直在忙期末考和实训,写笔记的时间也没有多少,不说废话了: 这文主要写两种模式:状态跟策略,主要是因为他们的类图一样,并且比较简单,写在同一篇文章里面容易甄别 状态模式:允许对象在内部状态改变时改变他的行为,对象看起来好像修改了他的类 先保留概念的意思,在平常的编程中,如果需要不同的状态,很一般的做法是在你要操作的类里面定义不同的常量代表不同的状态,然后if-else依据不同的状态有不同的实现: 1.你可以想象大量的if-else语句造成的低可读性和低效率 2.其次是你修改这个类的时候很麻

策略模式(headfirst设计模式学习笔记)

策略模式定义了算法族,分别封装起来,让他们可以相互替换,此模式让算法的变化独立于使用算法的客户. 继承,相似之处用继承,假如如干个功能点需要修改,代码难以维护, 原始代码 public class Duck { //鸭子描述 public void dispaly(){ System.out.println("描述"); } //鸭子叫 public void quack(){ System.out.println("会叫"); } } public class M

java笔记--策略模式和简单工厂模式

策略模式: --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3884781.html "谢谢-- 为什么使用:策略模式主要用于有很多不同的方式来解决同一个问题的情景.如:文件的保存:可保存成txt,也可保存成xml.另外压缩文件.商场的促销策略等是类似的 如何使用:需要定义一个接口或者抽象类来表示各种策略的抽象,由于在选择适当的策略上有些不方便,需要不断地判断需要的类型,因此需要用简单工厂方法来实现判断过程 例子: 用策略模式实现图

策略模式——HeadFirst 设计模式学习笔记

策略模式:策略模式定义了算法族,分别封装起来,让他们可以相互替换,此模式让算法的变化独立于使用算法的客户. 设计原则: 找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起.以便以后轻松的更改或扩充此部分,而不影响不需要变化的其他部分 针对接口编程而不是针对实现编程.实际的实现不会被绑定,调用时只知道调用的接口,而无需知道具体的实现方式 多用组合,少用继承.使用组合有很大的弹性,可以在运行时动态改变行为 要点: 良好的OO设计必须遵循可复用,可拓展,可维护 大部分模式允

JavaScript设计模式与开发实践---读书笔记(5) 策略模式

策略模式的定义是:定义一系列的算法,把它们一个个封转起来,并且使它们可以相互替换. JavaScript版本的策略模式: 奖金系统: var strategies = { "S": function(salary){ return salary*4; }, "A": function(salary){ return salary*3; }, "B": function(salary){ return salary*2; } }; var calc

JavaScript设计模式之策略模式(学习笔记)

在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选择学习策略模式. 策略模式:定义了一系列家族算法,并对每一种算法单独封装起来,让算法之间可以相互替换,独立于使用算法的客户. 通常我并不会记得“牛顿第一定律”的具体内容,所以我也难保证我会对这个定义记得多久……用FE经常见到的东西来举个例子说明一下: $("div").animation(