策略模式,其用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使得他们可以相互替换,策略模式使得算法可以在不影响到客户端的情况下发生变化。
策略模式结构
策略模式中有三个对象:
(1)
环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2)
抽象策略对象:它可由接口或抽象类来实现。
(3)
具体策略对象:它封装了实现同不功能的不同算法。
//环境角色
public class Context{
private Strategy strategy;
//策略方法
- public void contextInterface(){
- strategy.strategyInterface();
- }
- }
- //抽象策略类
- public abstract class Strategy{
- //策略方法
- public abstract void strategyInterface();
- }
- //具体策略类
- public class ConcreteStrategy extends Strategy{
- public void strategyInterface(){
- //............
- }
- }
- 二、一个图书折扣店的例子
- //抽象折扣类
- public abstract class DiscountStrategy{
- private single price = 0;
- private int copies = 0;
- //策略方法
- public abstract single calculateDiscount();
- public DiscountStrategy(single price , int copies){
- this.price = price;
- this.copies = copies;
- }
- }
- //具体折扣类(没有折扣)
- public class NoDiscountStrategy extends DiscountStrategy{
- private single price = 0;
- private int copies = 0;
- public NoDiscountStrtegy(single price, int copies){
- this.price = price;
- this.copies = copies;
- }
- public single calculateDiscount(){
- return 0;
- }
- }
- //
- public class FlatRateStrategy extends DiscountStrategy{
- private single price = 0;
- private int copies = 0;
- private single amount;
- public FlatRateStrategy(single price , int copies){
- this.price = price;
- this.copies = copies;
- }
- public single getAmount(){
- return amount;
- }
- public void setAmount(single amount){
- this.amount = amount;
- }
- public single calculateDiscount(){
- return copies*amount;
- }
- }
- //
- public class PercentageStrategy extends DiscountStrategy{
- private single percent;
- private single price = 0;
- private int copies = 0;
- public PercentageStrategy(single price , int copies){
- this.price = price;
- this.copies = copies;
- }
- public single getPercent(){
- return percent;
- }
- public void setPercent(single percent){
- this.percent = percent;
- }
- public single calculateDiscount(){
- return copies*price*percent;
- }
- }