Strategy(策略)

Strategy(策略) 行为型 对象 1

Intent_意图2

定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

Motivation_动机3

对算法进行包装,将使用算法的责任和算法本身分割开,委派给不同的对象管理,使得算法可以在不影响到客户的情况下发生变化

Applicability_适用性4

封装可以互换的行为,并使用委托来决定要使用哪一个

Structure_结构5

在这里插入图片描述

Participants_参与者6

  • Strategy(抽象策略) 定义了一个公共接口
  • ConcreteStrategy(具体策略) 实现了抽象策略定义的接口,提供具体的算法实现
  • Context(环境) 持有一个策略类的引用,最终给客户端调用

Collaborations_协作7

  1. Strategy定义一个公共接口,Context使用这个接口调用不同的算法
    ->Strategy一般使用接口或抽象类实现
  2. ConcreteStategy实现Strategy中定义的接口,提供具体的算法实现
  3. 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


  1. 模式分类归属 ↩︎

  2. 意图:描述该模式的作用,以及该模式的定义 ↩︎

  3. 动机:给出了问题以及如何解决这个问题的具体场景 ↩︎

  4. 适用性:描述模式可以被应用在什么场合 ↩︎

  5. 结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎

  6. 参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎

  7. 协作 :告诉参与者如何在此模式中合作 ↩︎

  8. 结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎

  9. 实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎

  10. 范例代码:提供代码的片段 ↩︎

  11. 已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎

  12. 相关模式:描述了此模式和其他模式之间的关系 ↩︎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值