设计模式(十二)---策略模式

定义:定义一组算法,将每个算法都封装其阿里,并且使它们之间可以互换。

  策略模式的一般模式:


  Context封装角色
  ---|它也叫作上下文对象,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,
  封装可能存在的变化。
  Strategy抽象策略角色
  ---|策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。
  ConcreteStrategy具体策略角色

  ---|实现抽象策略中的操作,该类含有具体的算法。

public class StrategyT {
	public static void main(String[] args) {
		//实现某个算法。
		Context context = new Context(new ConcreteStrategy());
		context.action();
	}
}
interface Strategy{
	//实现具体的算法操作
	public void doSomething();
}
class ConcreteStrategy implements Strategy{
	@Override
	public void doSomething() {
	System.out.println("come on operate some Arithmetics...");
	}
}
class Context{
	//私有方法指向具体的策略实现者
	private Strategy strategy;
	
	public Context(Strategy strategy) {
		this.strategy = strategy;
	}
	public void action(){
		this.strategy.doSomething();
	}
}

 一个例子:

  诸葛亮锦囊妙计的故事大家都听说过,那么在这个故事中也涉及到一个设计模式的道理。
  首先,诸葛亮给赵云三个锦囊,锦囊中分别是三个妙计,赵云在固定的地点打开锦囊,执行其任务,
  便能够化险为夷。那么我们用代码去实现这个策略模式吧。

public class StrategyTest {
	public static void main(String[] args) {
		//赵云来到吴国,打开第一个锦囊
		System.out.println("-------赵云来到吴国,打开第一个锦囊-----------");
		MyContext context1 = new MyContext(new BackDoor()); 
		//执行第一个锦囊妙招
		context1.operate();
		System.out.println("-------遇到麻烦打开第二个锦囊-------------");
		//遇到麻烦打开第二个锦囊
		MyContext context2 = new MyContext(new BackDoor()); 
		//执行第一个锦囊妙招
		context2.operate();
		System.out.println("-------想要溜走,又遇到麻烦---------");
		//想要溜走,又遇到麻烦
		MyContext context3 = new MyContext(new BackDoor()); 
		//执行第一个锦囊妙招
		context3.operate();
	}
}
interface IStrategy{
	//锦囊中的妙计,实现方法.具体的实现算法
	void operate();
}
/**
 * 锦囊妙计一
 * @author admin
 *
 */
class BackDoor implements IStrategy{
	@Override
	public void operate() {
		System.out.println("找乔国老开后门");
	}
}
/**
 * 锦囊妙计二
 * @author admin
 *
 */
class GivenGreenLight implements IStrategy{
	@Override
	public void operate() {
		System.out.println("找吴国太开绿灯");
	}
}
/**
 * 锦囊妙计三
 * @author admin
 *
 */
class BlockEnemy implements IStrategy{
	@Override
	public void operate() {
		System.out.println("孙夫人断后");
	}
}
/**
 * 具体的承载妙计的锦囊。
 * @author admin
 *
 */
class MyContext {
	//一个私有对象指向具体的实现算法类。
	private IStrategy strategy;
	
	public MyContext(IStrategy strategy) {
		this.strategy = strategy;
	}
	public void operate(){
		this.strategy.operate();
	}
}
  策略模式的优点
  ---|算法可以自由切换
  ---|避免使用多重条件的判断
  ---|扩展性良好
 
  策略模式的缺点
  ---|策略类数量增多
  ---|所有的策略类需要对外暴露
 
  策略模式的使用场景
  ---|多个类只有在算法或行为上稍有不同的场景
  ---|算法需要自由切换的场景
  ---|需要屏蔽算法规则的场景

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值