1 基本介绍
定义为:定义一些独立的类来封装不同的算法,并让它们可以相互替换。
Context
是用适用算法的角色
2 代码框架
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| abstract class AbstractStrategy { public abstract void algorithm(); }
class ConcreteStrategyA extends AbstractStrategy { public void algorithm() { } }
class Context { private AbstractStrategy strategy; public void setStrategy(AbstractStrategy strategy) { this.strategy= strategy; } public void algorithm() { strategy.algorithm(); } }
Context context = new Context(); AbstractStrategy strategy; strategy = new ConcreteStrategyA();
context.setStrategy(strategy); context.algorithm();
|
3 设计分析
实现电影院打折方案
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| package DesignPatterns.JavaDesign.Strategy;
import DesignPatterns.JavaDesign.FactoryMethod.XMLUtil;
public class Test { public static void main(String[] args) { MovieTicket mt = new MovieTicket(); double originalPrice = 60.0; double currentPrice; mt.setPrice(originalPrice); System.out.println("原始价为:" + originalPrice); System.out.println("---------------------------------"); Discount discount; discount = new ChildrenDiscount(); mt.setDiscount(discount); currentPrice = mt.getPrice(); System.out.println("折后价为:" + currentPrice); } }
class MovieTicket { private double price; private Discount discount; public void setPrice(double price) { this.price = price; } public void setDiscount(Discount discount) { this.discount = discount; }public double getPrice() { return discount.calculate(this.price); } }
interface Discount { public double calculate(double price); }
class StudentDiscount implements Discount { public double calculate(double price) { System.out.println("学生票:"); return price * 0.8; } }
class ChildrenDiscount implements Discount { public double calculate(double price) { System.out.println("儿童票:"); return price - 10; } }
class VIPDiscount implements Discount { public double calculate(double price) { System.out.println("VIP票:"); System.out.println("增加积分!"); return price * 0.5; } }
|
4 总结
优缺点分析
优点:
- 符合“开闭原则”,用户可以在不修改原有系统的基础上选择算法或行为。
- 策略模式提供了管理相关的算法族的办法
- 策略模式提供了一种算法的复用机制
- 使用策略模式可以避免多重条件选择语句
缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
- 策略模式将造成系统产生很多具体策略类,任何细小的变化都将导致系统要增加一个新的具体策略类
- 无法同时在客户端使用多个策略类
适用场景
- 一个系统需要动态地在几种算法中选择一种
- 一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重条件选择语句来实现