行为型模式-策略模式

suaxi
2022-09-16 / 0 评论 / 31 阅读 / 正在检测是否收录...
(1)概述

该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变换不会影响客户的使用;它属于对象行为模式,通过对算法进行封装,把使用算法的责任和算法的实现分开,并委派给不同的对象对这些算法进行管理

(2)结构
  • 抽象策略类:该角色给出所有的策略类所需的接口
  • 具体策略类:实现抽象策略定义的接口,提供具体的算法实现或行为
  • 环境类:持有一个策略类的引用,供客户端调用
(3)案例

以促销活动为例

2.策略模式(商场促销案例).png

抽象策略类

public interface Strategy {

    /**
     * 展示促销活动
     */
    void show();
}

具体策略类

public class StrategyA implements Strategy {

    @Override
    public void show() {
        System.out.println("促销活动A");
    }
}

public class StrategyB implements Strategy {

    @Override
    public void show() {
        System.out.println("促销活动B");
    }
}

public class StrategyC implements Strategy {

    @Override
    public void show() {
        System.out.println("促销活动C");
    }
}

环境类

public class SalesMan {

    private Strategy strategy;

    public SalesMan(Strategy strategy) {
        this.strategy = strategy;
    }

    public Strategy getStrategy() {
        return strategy;
    }

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

    /**
     * 促销员展示促销活动
     */
    public void salesManShow() {
        strategy.show();
    }
}

Client

public class Client {
    public static void main(String[] args) {
        //促销活动A
        SalesMan salesMan = new SalesMan(new StrategyA());
        salesMan.salesManShow();

        System.out.println("=======================");
        //促销活动B
        salesMan.setStrategy(new StrategyB());
        salesMan.salesManShow();

        System.out.println("=======================");
        //促销活动C
        salesMan.setStrategy(new StrategyC());
        salesMan.salesManShow();
    }
}
(4)优缺点
  • 策略类之间可以自由切换
  • 新增策略时增加对应的具体策略类即可,复合开闭原则
  • 在一定程度上减少了条件选择语句的使用
  • 客户端必须知道所有的策略类,并自行决定使用哪一个
  • 可能产生很多的具体策略类
(5)使用场景
  • 系统中需要动态的在几种算法中选择一种时
  • 一个类定义了多种行为,且这些行为在这个类的操作中以多个条件语句的形式出现时,可将每个分支条件移入各自对应的策略类中
  • 系统中的算法各自独立,且要求对客户隐藏实现的细节时
  • 多个类只区别在表现型为不同,可选择策略模式,在运行时动态选择具体要执行的行为
0

评论 (0)

取消