Strategy(策略) 行为型 对象 1
Intent_意图2
定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
Motivation_动机3
对算法进行包装,将使用算法的责任和算法本身分割开,委派给不同的对象管理,使得算法可以在不影响到客户的情况下发生变化
Applicability_适用性4
封装可以互换的行为,并使用委托来决定要使用哪一个
Structure_结构5
Participants_参与者6
- Strategy(抽象策略) 定义了一个公共接口
- ConcreteStrategy(具体策略) 实现了抽象策略定义的接口,提供具体的算法实现
- Context(环境) 持有一个策略类的引用,最终给客户端调用
Collaborations_协作7
- Strategy定义一个公共接口,Context使用这个接口调用不同的算法
->Strategy一般使用接口或抽象类实现 - ConcreteStategy实现Strategy中定义的接口,提供具体的算法实现
- Context持有一个Strategy类的引用,通过Strategy提供的公共接口,调用不同的算法
Comsequences_结果8
- 优点
算法可自由切换
扩展性良好
避免使用多重条件判断 - 缺点
策略类数量增多
所有的策略类都需要对外暴露 - 用途
当多个类只在算法或行为上稍有不同时
算法需要自由切换时
需要屏蔽算法规则时
Implementation/Sample Code_实现/范例代码910
Implementation
Strategy
public interface Strategy {
public void strategyMethod();
}
ConcreteStrategy
public class ConcreteStrategyA implements Strategy {
public void strategyMethod() {
// TODO
}
}
public class ConcreteStrategyB implements Strategy {
public void strategyMethod() {
// TODO
}
}
Context
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void contextMethod() {
strategy.strategyMethod();
}
}
Sample Code
Strategy
public interface MemberStrategy {
public double calcPrice(double price);
}
ConcreteStrategy
public class PrimaryMemberStrategy implements MemberStrategy {
@Override
public double calcPrice(double price) {
System.out.println("no discount for Primary Member");
return price;
}
}
public class IntermediateMemberStrategy implements MemberStrategy {
@Override
public double calcPrice(double price) {
System.out.println("10% off for Intermediate Member");
return price * 0.9;
}
}
public class AdvanceMemberStrategy implements MemberStrategy {
@Override
public double calcPrice(double price) {
System.out.println("20% off for Advance Member");
return price * 0.8;
}
}
Context
public class Price {
private MemberStrategy strategy;
public Price(MemberStrategy strategy) {
this.strategy = strategy;
}
public double quote(double price) {
return strategy.calcPrice(price);
}
public void setStrategy(MemberStrategy strategy) {
this.strategy = strategy;
}
}
Client
public class Client {
public static void main(String[] args) {
MemberStrategy strategy = new PrimaryMemberStrategy();
Price price = new Price(strategy);
System.out.println("The final price of this item, it's $" + price.quote(100));
strategy = new AdanceMemberStrategy();
price.setStrategy(stragegy);
System.out.println("The final price of this item, it's $" + price.quote(100));
}
}
Result
The final price of this item, it's $100
The final price of this item, it's $80
Known Uses_已知应用11
Related Patterns_相关模式12
模式分类归属 ↩︎
意图:描述该模式的作用,以及该模式的定义 ↩︎
动机:给出了问题以及如何解决这个问题的具体场景 ↩︎
适用性:描述模式可以被应用在什么场合 ↩︎
结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎
参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎
协作 :告诉参与者如何在此模式中合作 ↩︎
结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎
实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎
范例代码:提供代码的片段 ↩︎
已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎
相关模式:描述了此模式和其他模式之间的关系 ↩︎