首页 > 编程知识 正文

java策略模式应用场景,java策略模式替代switch

时间:2023-05-05 14:42:19 阅读:274110 作者:2158

 Strategy模式也叫策略模式,是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。Strategy模式主要用来平滑地处理算法的切换。

主要解决:在有多种算法相似的情况下,使用if...else所带来的复杂和难以维护。当一个系统有许多许多类,而区分它们的只是他们直接的行为。可以将这些算法封装成一个一个的类,任意地替换。

使用场景举例:

     1、舒适的康乃馨的锦囊妙计,每一个锦囊就是一个策略。

    2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。

    3、JAVA AWT 中的 LayoutManager。

策略模式UML结构图:


角色和职责:

    Strategy:策略(算法)抽象。

    ConcreteStrategy :各种策略(算法)的具体实现。

    Context :封装类,或者说策略的容器类。根据不同策略执行不同的行为。策略由外部环境决定。

以超市不同打折的方式为例,如下:

首先定义一个策略接口,并定义一个cost方法:

public interface Strategy {public double cost(double num);}对接口进行具体的不同实现:public class StrategyA implements Strategy {public double cost(double num) {return num*0.8;}}public class StrategyB implements Strategy {public double cost(double num) {if (num >= 200) {return num - 50;}return num;}}

定义策略的容器类Context:

public class Context {private Strategy strategy;public Context(Strategy strategy){this.strategy = strategy;}public double cost(double num){return this.strategy.cost(num);}}

写一个测试类来测试:

public class MainClass {public static void main(String[] args) {double num =200;Context context = new Context(new StrategyB());double newNum = context.cost(num);System.out.println("策略B付账:" + newNum);context = new Context(new StrategyA());System.out.println("策略A付账:" + context.cost(num));}}

运行结果:

    策略B付账:150.0
    策略A付账:160.0

策略模式的优缺点:

优点:

    1. 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免重复的代码。

    2. 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。

3. 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。

缺点:

    1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。

    2. 策略模式造成很多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。