设计模式 - 行为型模式考点篇:策略模式(概述 | 案例实现 | 优缺点 | 使用场景)

目录

一、行为型模式

1.1、策略模式

1.1.1、概论

1.1.2、案例实现

1.1.3、优缺点

1.1.4、使用场景


一、行为型模式


1.1、策略模式

1.1.1、概论

策略模式设计的每一个算法都封装了起来,使他们可以相互替换,通过一个对象委派不同的算法给相应的客户进行使用.

例如一家百货公司,规定在逢年过节的时候进行促销活动. 针对不同的节日(春节、中秋节、端午节)推出不同的促销活动,然后由 促销员 将促销活动展示给客户.

策略模式主要角色如下:

  • 抽象策略类:由一个接口或者抽象类来实现,给出了所有 具体策略类 所需的接口.
  • 提交策略类:实现了抽下你个策略定义的接口,提供具体的算法实现.
  • 环境类:持有一个策略类引用,最终给客户端调用.

1.1.2、案例实现

针对以上案例进行实现.

java 复制代码
/**
 * 抽象策略: 促销活动接口
 */
public interface Strategy {

    void show();

}
java 复制代码
/**
 * 具体策略类: 春节活动类
 */
public class StrategyA implements Strategy {

    @Override
    public void show() {
        System.out.println("春节到了,全场买一送一!");
    }

}
java 复制代码
/**
 * 具体策略类: 中秋节活动类
 */
public class StrategyB implements Strategy {

    @Override
    public void show() {
        System.out.println("中秋节到了,全场满 50 送月饼!");
    }

}
java 复制代码
/**
 * 具体策略类: 端午节活动类
 */
public class StrategyC implements Strategy {

    @Override
    public void show() {
        System.out.println("端午节到了,全场满 80 送粽子!");
    }

}
java 复制代码
/**
 * 环境类: 销售员类
 */
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 showAction() {
        strategy.show();
    }

}
java 复制代码
public class Client {

    public static void main(String[] args) {
        //1.春节
        SalesMan man = new SalesMan(new StrategyA());
        man.showAction();
        System.out.println("======================");
        //2.中秋节
        man.setStrategy(new StrategyB());
        man.showAction();
        System.out.println("======================");
        //3.端午节
        man.setStrategy(new StrategyC());
        man.showAction();
        System.out.println("======================");
    }

}

执行结果如下:

1.1.3、优缺点

优点:

  • 策略类之间可以自由切换:由于策略类都实现同一个接口,所以使得他们之间可以根据不同的需求场景任意切换.
  • 易扩展,符合开闭原则:增加一个新的的策略只需要添加一个具体的策略类即可,不需要修改原有代码.
  • 避免使用多重条件选择语句(if else),充分体现面向对象设计思想.

缺点:

客户端必须知道所有的策略类,并自行决定使用哪个策略类.

策略模式将造成产生多个策略类(一个策略产生一个类).

1.1.4、使用场景

  1. 一个系统需要动态的在几种算法中选择一种时,可以将每个算法封装到策略类中.
  2. 一个类定义了多个行为,并且这些行为在这个类中以多个条件语句(if else)出现,就可以将每个分支移入他们各自的策略类中以替代这些条件语句.
  3. 每个策略算法彼此独立,要对客户隐藏具体算法实现细节.
相关推荐
杰_happy2 小时前
设计模式:原型模式(C++)
c++·设计模式·原型模式
OpenC++2 小时前
【C++】简单工厂模式/工厂方法模式/抽象工厂模式对比
c++·设计模式·简单工厂模式·工厂方法模式·抽象工厂模式
99乘法口诀万物皆可变6 小时前
C#设计模式之AbstractFactory_抽象工厂_对象创建新模式-学习
设计模式·c#·抽象工厂模式
英杰.王7 小时前
设计模式-接口隔离原则(Interface Segregation Principle, ISP)
设计模式·接口隔离原则
易元8 小时前
设计模式-状态模式
后端·设计模式
英杰.王9 小时前
设计模式-里氏替换原则(Liskov Substitution Principle, LSP)
设计模式·里氏替换原则
守城小轩10 小时前
Chromium 136 编译指南 macOS篇:Xcode安装与配置(二)
macos·xcode·策略模式
qqxhb15 小时前
零基础设计模式——总结与进阶 - 3. 学习资源与下一步
学习·设计模式·重构·代码整洁之道
我叫小白菜15 小时前
【Java_EE】设计模式
java·开发语言·设计模式
是2的10次方啊15 小时前
🎯 设计模式完全指南:从生活智慧到代码艺术
设计模式