【设计模式】(二十三)--行为型模式--策略模式
程序员文章站
2024-03-24 19:17:04
...
【设计模式】(二十三)–行为型模式–策略模式
行为型模式--策略模式
策略模式定义
Define a family of algorithms, encapsulate each one, and make them interchangeable.
意思是:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。
策略模式通常有三个元素:
- Strategy 抽象策略,对策略算反进行抽象,通常定义每个策略或算法都必须具有的方法和属性。
- ConcreteStrategy 具体策略,实现抽象策略中的具体操作的类,含有具体的算法。
- Context 环境,运行特定策略的类,也叫作上下文,屏蔽高层模块对策略、算法的直接访问,持有一个Strategy类的引用。
策略模式的优点
- 1、算法可以*切换。
- 2、避免使用多重条件判断。
- 3、扩展性良好。
策略模式还有以下缺点
- 1、策略类会增多。 每一种算法都封装到每一个具体策略实现中。
- 2、所有策略类都需要对外暴露。所以调用者需要知道所有的策略类, 并且自行选择所需要的具体策略类。
策略模式的使用场景
- 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
- 2、一个系统需要动态地在几种算法中选择一种。
- 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
策略模式的简单实现
类图
实现
public class Context {
private Strategy strategy;
public int execute(int count) {
return strategy.doCalculate(count);
}
public static void main(String[] args) {
Strategy buy1Get1Free = new Buy1Get1FreeStrategy();
Strategy a20Percent = new TwentyPercentDiscountStrategy();
Context context = new Context();
System.out.println("购买2杯奶茶,现在有两种策略");
context.setStrategy(buy1Get1Free);
context.execute(1);
context.setStrategy(a20Percent);
context.execute(2);
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
public interface Strategy {
int PRICE = 20;
int doCalculate(int count);
}
/**
* 买一送一活动
*/
public class Buy1Get1FreeStrategy implements Strategy {
@Override
public int doCalculate(int count) {
int total = count * PRICE;
System.out.println("使用买一送一活动,买了+" + count + "杯480ml的奶茶,送一杯360ml奶茶,共计:" + total);
return total;
}
}
/**
* 8折优惠活动
*/
public class TwentyPercentDiscountStrategy implements Strategy {
@Override
public int doCalculate(int count) {
int total = count * PRICE * 80 / 100;
System.out.println("使用八折优惠策略,购买" + count + "杯480ml奶茶,总共" + total);
return total;
}
}
结果
上一篇: iOS沙盒路径记录
推荐阅读