策略模式解决的问题
策略模式定义了一系列算法,也可以称之为解决方案,并将每一个方法封装起来,使他们可以相互替换,让算法独立于使用他的客户而变化。这样的话就可以解决在编码时使用大量if else的问题,如果在一个条件语句中又嵌套了多个条件语句,就会使代码变得臃肿,维护成本也加大,策略模式可以很好的解决这个问题。
策略模式使用场景
1.针对同一类型问题的多种处理方式,仅仅有具体行为差异时
2.需要安全的封装多种同一类型的操作时
3.同一个抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时
策略模式角色
环境角色(context):持有一个Strategy的引用
抽象策略角色(strategy):这是一个抽象角色,通常由接口或者抽象类实现。次角色给出所有的具体侧罗所需的接口。
具体策略角色(concreteStrategy):包装了相关的算法和行为
简单策略模式代码模板
抽象策略类
//抽象策略类
public interface Strategy{
//策略方法
public void strategyInterface();
}
具体策略类
//具体策略类
public class ConcreteStrategyA implements Strategy{
@Override
public void strategyInterface(){
//具体策略方法
}
}
//具体策略类
public class ConcreteStrategyB implements Strategy{
@Override
public void strategyInterface(){
//具体策略方法
}
}
环境角色类
//环境角色类
public class Context {
//持有一个具体策略的对象
private Strategy strategy;
/**
* 构造函数,传入一个具体策略对象
* @param strategy 具体策略对象
*/
public Context(Strategy strategy){
this.strategy = strategy;
}
/**
* 策略方法
*/
public void contextInterface(){
strategy.strategyInterface();
}
}
举个比较简单的例子,冲q币的时候会员是97折,超级会员是92折。那么这就是两种策略。下面用代码实现。
1.创建一个计算价格的策略接口
public interface CalPrice(){
//计算价格的方法
DOuble returnPrice(Double QNum);
}
2.创建两个具体的价格计算策略
public class Vip implements CalPrice(){
@Override
Double returnPrice(Double QNum){
return QNum * 0.97;
}
}
public class SVip implements CalPrice(){
@Override
Double returnPrice(Double QNum){
return QNum * 0.92;
}
}
3.创建一个用户角色,带有冲q币的功能
public class Player{
private CalPrice calPrice;
public SetVip(CalPrice calPrice){
this.calPrice = calPrice;
}
public void returnPrice(Double QNum){
calPrice.returnPrice(Double QNum);
}
}
4.使用方法
public static void main(String[] args){
Player player = new Player();
player.setVip(new SVip);
player.returnPrice(12);
}
总结
通过将冲值q币的方法独立出来,实现了用户和身份的松耦合,可以动态的改变角色的身份,同时将冲q币的方法委托给了CalPrice类去执行,角色类不在实现具体的冲q币的方法,这也是一种组合的概念,符合多用组合,少用继承的设计原则(角色的冲q币方式不是继承来的,而是和CalPrice 组合来的)。