Java策略模式

策略模式通常是將一个系列的算法包装到一系列的策略类里面管理,一個策略类管理一个算法,

涉及角色:
  1. 环境角色:持有一个策略角色的引用,是真实与调用者打交道的角色
  2. 抽象策略角色:一般是一个接口或者抽象类,定义所有策略类的接口
  3. 真实策略角色:真正包装不同算法的类,通常都存在多个这样的角色
本质:
  • 算法分离,选择实现
    场景: 你是一个服装批发商,针对不同的客户会报出不同的价格(这种情况很常见),
    现在有4个人要从你这里批发服装
    • 客户A: 50件
    • 客户B: 200件
    • 客户C: 800件
    • 客户D: 2000件
/**抽象策略角色*/
public interface Strategy{    double getPrice(double price);}

//真实策略角色:购买1 ~ 100件的客户   
public class CommonCustomer0To100 implements Strategy {
    @Override    
    public double getPrice(double price){        
    	//95折,这里是具体算法,例子只是一个简单乘法运算,完全可以想象成一个复杂的算法,最终返回结果        
    	return price * 0.95;    
    }
}

//真实策略角色:购买100 ~ 500件的客户   
public class CommonCustomer100To500 implements Strategy {
    @Override    
    public double getPrice(double price){             
    return price * 0.9;    
    }}
//真实策略角色:购买5 ~ 1000件的客户   
public class CommonCustomer500To1k implements Strategy {
    @Override    
    	public double getPrice(double price){          
    	return price * 0.8;    
    }
}
//真实策略角色:购买1000 ~ 5000件的客户   
public class CommonCustomer1kTo5k implements Strategy {
    @Override    
    public double getPrice(double price){          
    	return price * 0.7;    
    }
}
    
/**真实和调用者打交道的角色*/
public class StrategyContext{    
	private Strategy strategy;  //会引用一个真实策略角色    
	public StrategyContext(Strategy strategy){        
		this.strategy = strategy;    
	}    
	//报价    
	public void printPrice(double s){
    		System.out.println(strategy.getPrice(s));    
    	}
}

上面分别定义了抽象策略角色、多个真实策略角色以及上下文角色
在使用中:

  • 当客户A前来购买:
	//调用者访问,使用策略模式需要调用者知道全部的真实策略类,比如//当客户A前来,调用者知道,需要使用CommonCustomer0To100 类型
	Strategy sty = new CommonCustomer0To100();
	//创建持有策略角色的上下文,这里持有角色是可选的
	StrategyContext ctx = new StrategyContext(sty);
	//此时对于A客户会报出的价格
	ctx.printPrice(1000);
  • 当客户D前来购买:
	//D客户前来 。。。 
	Strategy sty = new CommonCustomer1kTo5k();
	StrategyContext ctx = new StrategyContext(sty);
	ctx.printPrice(1000);   //报价
总结一下:策略模式就是同一的管理一系列算法(算法族),通常这样的算法复杂度比较高或者不易管理的时候使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值