Java设计模式-策略模式

Posted xstxjs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式-策略模式相关的知识,希望对你有一定的参考价值。

简介

在软件开发中,设计模式是为了解决常见问题而提供的一套可重用的解决方案。策略模式(Strategy Pattern)是其中一种常见的设计模式,它属于行为型模式。该模式的核心思想是将不同的算法封装成独立的策略类,使得它们可以相互替换,而不影响客户端的使用。

策略模式与其他设计模式有一些明显的区别。与模板方法模式相比,策略模式强调算法的灵活性,允许在运行时切换不同的策略。与状态模式相比,策略模式更注重不同算法之间的替换性,而非状态的内部转换。

实现

在Java编程语言中,实现策略模式需要以下几个关键元素:策略接口、具体策略类和环境类。

首先,定义一个策略接口,其中包含策略类共有的方法。例如:

public interface Strategy 
    void execute();

接下来,创建具体策略类,实现策略接口并实现具体的算法。例如:

public class ConcreteStrategyA implements Strategy 
    @Override
    public void execute() 
        // 具体算法A的实现
    


public class ConcreteStrategyB implements Strategy 
    @Override
    public void execute() 
        // 具体算法B的实现
    

然后,定义一个环境类,用于持有策略对象并在运行时切换不同的策略。例如:

public class Context 
    private Strategy strategy;

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

    public void setStrategy(Strategy strategy) 
        this.strategy = strategy;
    

    public void executeStrategy() 
        strategy.execute();
    

通过以上实现,我们可以根据需要选择不同的具体策略类,并通过环境类进行调用。例如:

Strategy strategyA = new ConcreteStrategyA();
Context context = new Context(strategyA);
context.executeStrategy();

Strategy strategyB = new ConcreteStrategyB();
context.setStrategy(strategyB);
context.executeStrategy();

优缺点

优点

  1. 策略类之间相互独立,易于扩展和维护。
  2. 可以在运行时动态切换策略,灵活性高。
  3. 提供了一种可替代继承的方案,避免继承层次的臃肿。

缺点

  1. 客户端需要了解不同的策略类,增加了使用的复杂度。
  2. 策略模式增加了类的数量,可能会导致系统更加庞大。

运用场景

策略模式适用于以下场景:

  1. 需要在不同算法之间灵活切换的情况。
  2. 有多个类似的条件语句,可以使用策略模式提取出这些条件逻辑。
  3. 需要封装一些具体的算法,使其独立于客户端而变化。

总结

策略模式是一种灵活的行为型设计模式,通过封装不同的算法成为独立的策略类,使得这些算法可以在运行时相互替换。通过定义策略接口、具体策略类和环境类,我们可以在Java中实现策略模式。该模式具有灵活性高、易于扩展和维护等优点,适用于需要动态切换算法或封装具体算法的场景。然而,策略模式也需要客户端了解不同的策略类,增加了复杂度,并可能导致系统庞大。

总而言之,策略模式是一种强大而灵活的设计模式,可以提供可复用的算法解决方案。通过合理地应用策略模式,我们可以提高代码的灵活性、可扩展性和可维护性,从而更好地应对不同的业务需求。

java策略模式应用场景为何?

我认为策略模式是java众多模式中最常用,最常见的一种模式。

一句话说,针对同一命令(或行为),不同的策略做不同的动作。 (个人总结 难免疏漏 海涵)

举例来说,一个接口有两个实现:
interface RunBehavior
public void performRun();


class Run implements RunBehavior
public void performRun() System.out.println(" I can run!");


class JumpAsRun implements RunBehavior
public void performRun() System.out.println("I cannot run, but I can jump!");


解释一下这段简单的程序
跑是一种行为(接口)
正常的动物都可以跑(class Run)
麻雀是不能跑的,它只能跳(class JumpAsRun)

这样的话,其实我们有了一个行为的请求,那就是跑,然后我们有两个策略供选择。

那么如何调用呢?
class Anmial
RunBehavior runBehavior;
public void run()
this.runBehavior.performRun();


public void setRunBehavior(RunBehavior runBehavior)
this.runBehavior = runBehavior;



下面真正开始调用:

public class TestStrategy

public static void main(String args[])
RunBehavior rb1 = new Run();
Animal tiger = new Animal();
tiger.setRunBehavior(rb1);
tiger.run();

RunBehavior rb2 = new JumpAsRun();
Animal bird = new Animal();
bird.setRunBehavior(rb2);
bird.run();

// 上面的老虎和鸟分别用了一个策略,下面让老虎用鸟的策略
// 看看会发生什么
tiger.setRunBehavior(rb2);
tiger.run();
// 其实策略模式的重点就在这儿,给对象传入什么样的策略,执行什么样的动作。



具体的还要你自己多思考了,推荐《Head First Desigh Pattern》

全手工敲入代码,估计你需要微调如果想运行的话
参考技术A http://blog.csdn.net/u013279866/article/details/72398113

以上是关于Java设计模式-策略模式的主要内容,如果未能解决你的问题,请参考以下文章

java策略模式应用场景为何?

《JAVA与模式》之策略模式

java设计模式---策略模式(案例解析)

Java 设计模式—策略模式

Java设计模式-策略模式

Java设计模式之策略模式