一:策略模式
1.什么是策略模式?
模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。
策略模式的基本介绍
1.策略模式(Strategy Pattern)中,定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
2.这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口);第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)。
2.策略模式适合应用场景
1.当你想使用对象中各种不同的算法变体, 并希望能在运行时切换算法时, 可使用策略模式。
2.当你有许多仅在执行某些行为时略有不同的相似类时, 可使用策略模式。
3.如果算法在上下文的逻辑中不是特别重要, 使用该模式能将类的业务逻辑与其算法实现细节隔离开来。
4. 当类中使用了复杂条件运算符以在同一算法的不同变体中切换时, 可使用该模式。
5. 程序种有大量if/else的语句
3.策略模式优缺点
优点:
1.你可以在运行时切换对象内的算法。
2.你可以使用组合来代替继承。
3.开闭原则。 你无需对上下文进行修改就能够引入新的策略。
缺点:
1.在封装器栈中删除特定封装器比较困难。
2.实现行为不受装饰栈顺序影响的装饰比较困难。
3.各层的初始化配置代码看上去可能会很糟糕。
4.策略模式角色:
抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。
环境(Context)类:持有一个策略类的引用,最终给客户端调用
二:策略模式代码实现
案例:促销活动
一家百货公司在定年度的促销活动。针对不同的节日(春节、中秋节、圣诞节)推出不同的促销活动,
由促销员将促销活动展示给客户。类图如下:
抽象策略
/**
* @Author cgz
* @Date 2022/11/17 16:58
*/
public interface Strategy {
void show();
}
具体策略
/**
* @Author cgz
* @Date 2022/11/17 16:58
*/
//春节活动
public class StrategyA implements Strategy{
@Override
public void show() {
System.out.println("买一送一");
}
}
/**
* @Author cgz
* @Date 2022/11/17 16:58
*/
//中秋活动
public class StrategyB implements Strategy{
@Override
public void show() {
System.out.println("买一送二");
}
}
/**
* @Author cgz
* @Date 2022/11/17 16:58
*/
//圣诞节活动
public class StrategyC implements Strategy{
@Override
public void show() {
System.out.println("买一送三");
}
}
环境
/**
* @Author cgz
* @Date 2022/11/17 16:59
*/
public class SalesMan {
//持有抽象策略角色的引用
private Strategy strategy;
public SalesMan(Strategy strategy) {
this.strategy = strategy;
}
//向客户展示促销活动
public void salesManShow(){
strategy.show();
}
}