设计模式:策略模式

定义

策略模式是一种比较简单的模式:定义一组算法,将每个算法封装起来,并且使他们之间可以互换。

策略模式的通用类图:


策略模式使用的是面向对象的继承和多态机制,非常容易理解和掌握,
  • Context封装角色
也叫上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
  • Strategy抽象策略角色
策略、算法的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。
  • ConcreteStrategy具体策略角色
实现抽象策略中的操作,该类包含具体的算法


通用代码实现

抽象的策略角色
public interface Strategy {
        //策略模式的运算法则
        public void doSomething();
}


具体策略角色
public class ConcreteStrategy implements Strategy {
        public void doSomething() {
            System.out.println("");
        }
}


封装角色
策略模式的重点是封装角色,它是借用了代理模式的思路,差别就是策略模式的封装角色和被封装的策略不用是同一个接口,如果是同一个接口那就成为代理模式了。

public class Context {
	//抽象策略
	private Strategy strategy = NULL;
	//构造函数设置具体策略
	public Context(Strategy strategy) {
		this.strategy = strategy;
	}
	//封装后的策略方法
	public void doAnything(){
		this.strategy.doSomething();
	}
}



高层模块调用非常简单,知道用哪个策略,产生它的对象,然后放到封装角色中就完成任务了。

策略模式的应用

优点
  • 算法可以自由的切换:
只要实现抽象策略,它就成为策略家族中的一个成员,通过封装角色对其进行封装,保证对外提供可自由切换的策略。
  • 避免使用多重条件判断:
如果没有策略模式,一会要使用A策略一会要使用B策略,怎么设计?使用多重的条件语句?多重条件语句不易维护,而且出错的概率大大增加。使用策略模式后,可以由其他模块决定使用何种策略
  • 扩展性良好
缺点
  • 策略类数量增多:每一个策略一个类,复用的可能性很小
  • 所有的策略类都需要对外暴露
使用场景
  • 多个类只有在算法或行为上稍有不同的场景
  • 算法需要自由切换








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值