java设计模式之策略模式

一:策略模式

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();
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会敲代码阿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值