当前位置: 主页 > JAVA语言

策略模式java-策略模式与工厂模式

发布时间:2023-04-20 10:02   浏览次数:次   作者:佚名

一:策略模式

1.什么是策略模式?

模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。

策略模式的基本介绍

1.策略模式(Strategy Pattern)中,定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

2.这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口);第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)。

2.策略模式适合应用场景

1.当你想使用对象中各种不同的算法变体策略模式java, 并希望能在运行时切换算法时, 可使用策略模式。

2.当你有许多仅在执行某些行为时略有不同的相似类时, 可使用策略模式。

3.如果算法在上下文的逻辑中不是特别重要, 使用该模式能将类的业务逻辑与其算法实现细节隔离开来。

4. 当类中使用了复杂条件运算符以在同一算法的不同变体中切换时, 可使用该模式。

5. 程序种有大量if/else的语句

3.策略模式优缺点

优点:

1.你可以在运行时切换对象内的算法。

2.你可以使用组合来代替继承。

3.开闭原则。 你无需对上下文进行修改就能够引入新的策略。

缺点:

1.在封装器栈中删除特定封装器比较困难。

2.实现行为不受装饰栈顺序影响的装饰比较困难。

3.各层的初始化配置代码看上去可能会很糟糕。

4.策略模式角色:

抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。

环境(Context)类:持有一个策略类的引用策略模式java,最终给客户端调用

二:策略模式代码实现

案例:促销活动

一家百货公司在定年度的促销活动。针对不同的节日(春节、中秋节、圣诞节)推出不同的促销活动,

由促销员将促销活动展示给客户。类图如下:

在这里插入图片描述

抽象策略


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