Java设计模式--策略模式

简介: 策略模式(别名:政策)定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。Strategy Pattern(Another Name: Policy)Define a family of algorithms, encapsulate each one, and make them inter changeab

策略模式(别名:政策)

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

Strategy Pattern(Another Name: Policy)

Define a family of algorithms, encapsulate each one, and make them inter changeable. Strategy lets the algorithm vary independently from clients that use it.

类图

模式的结构与使用

策略方法模式的结构中包括三种角色。
+ 策略(Strategy):策略是一个接口,该接口定义若干个算法标识,即定义了若干个抽象方法。
+ 具体策略(Concrete Strategy):具体策略是实现策略接口的类。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体算法。
+ 上下文(Context):上下文是依赖于策略接口的类,即上下文包含有策略声明的变量。上下文中提供一个方法,该方法委托策略变量调用具体策略所实现的策略接口中的方法。

简单的例子

Abstract Strategy的接口类ComputableStrategy.java

package Strategy;

public interface ComputableStrategy {
    public abstract double computableStrategy(double[] a);
}

Strategy的实现类StrategyOne.java

package Strategy;

public class StrategyOne implements ComputableStrategy {

    @Override
    public double computableStrategy(double[] a) {
        double score = 0, sum = 0;
        for (int i = 0; i < a.length; i++) {
            sum = sum + a[i];
        }
        score = sum/a.length;
        return score;
    }
}

Strategy的实现类StrategyTwo.java

package Strategy;

public class StrategyTwo implements ComputableStrategy {

    @Override
    public double computableStrategy(double[] a) {
        double score = 0, multi = 1;
        int n = a.length;
        for (int i = 0; i < a.length; i++) {
            multi = multi * a[i];
        }
        score = Math.pow(multi, 1.0/n);
        return score;
    }
}

Strategy的实现类StrategyThree.java

package Strategy;

import java.util.Arrays;

public class StrategyThree implements ComputableStrategy {

    @Override
    public double computableStrategy(double[] a) {
        if (a.length <= 2)
            return 0;
        double score = 0, sum = 0;
        Arrays.sort(a);
        for (int i = 1; i < a.length - 1; i++) {
            sum = sum + a[i];
        }
        score = sum/(a.length-2);
        return score;
    }
}

Context类GymnasticsGame.java

package Strategy;

public class GymnasticsGame {
    ComputableStrategy strategy;

    public void setStrategy(ComputableStrategy strategy) {
        this.strategy = strategy;
    }

    public double getPersonScore(double a[]) {
        if (strategy != null) {
            return strategy.computableStrategy(a);
        } else
            return 0;
    }
}

测试类Application.java

package Strategy;

public class Application {

    public static void main(String[] args) {
        GymnasticsGame game = new GymnasticsGame();
        game.setStrategy(new StrategyOne());
        Person zhang = new Person();
        zhang.setName("张三");
        double[] a = {9.12, 9.25, 8.87, 9.99, 6.99, 7.88};
        Person li = new Person();
        li.setName("李四");
        zhang.setScore(game.getPersonScore(a));
        li.setScore(game.getPersonScore(a));
        System.out.println(zhang.getScore());
        System.out.println(li.getScore());

        game.setStrategy(new StrategyThree());
        zhang.setScore(game.getPersonScore(a));
        li.setScore(game.getPersonScore(a));
        System.out.println(zhang.getScore());
        System.out.println(li.getScore());
    }
}

class Person {
    String name;
    double score;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}

执行效果图

策略模式的优点

  • 上下文(Context)和具体策略(ConcreteStrategy)是松耦合关系。因此上下文只知道它要使用某一个实现Strategy接口类的实例,但不需要知道具体是哪一个类。
  • 策略模式满足“开-闭原则”。当增加新的具体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略的实例。

适用策略模式的情景

  • 一个类定义了多种行为,并且这些行为在这个类的方法中以多个条件语句的形式出现,那么可以使用策略模式避免在类中使用大量的条件语句。
  • 程序不希望暴露复杂的、与算法有关的数据结构,那么可以使用策略模式封装算法。
  • 需要使用一个算法的不同变体。

下载源码请到

MyGitHub

目录
相关文章
|
23天前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
45 4
|
12天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
14天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
34 1
|
18天前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
22 2
|
23天前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
29 4
|
1月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
43 2
|
2月前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
49 0
[Java]23种设计模式
|
28天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文通过游泳运动员的案例,介绍策略模式及其在Kotlin中的改良应用,利用高阶函数简化代码结构,提高灵活性。
35 3
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文介绍策略模式在Kotlin中的应用,通过游泳运动员的例子,展示如何使用接口和高阶函数实现策略模式,使代码更简洁、灵活。
31 2