策略模式(Strategy Pattern)

horizonheart 2013-10-13

什么是策略模式:

策略模式就是:定义一组或者系列算法,然后将这些算法封装,可以实现算法的切换。

策略模式应用场景:

策略模式一般用于封装系列的计算方法,这些算法通常封装在一个context的类中。

在程序里面我们可以自由地选择其中一种算法。最常见的应用场景比如商场商品的

促销折扣计算。

用switch我们也可以实现这些功能,只不过代码扩展性不好,如果我们需要加入一

个折扣的计算,那么我们改动的地方较多。

public interface DiscountStrategy {
		//计算打折价的方法
		public abstract double getDiscount(double originalPrice);
}

提供两种实打折算法的实现类

public class VipDiscount implements DiscountStrategy {
		//提供VIP的打折算法
		public double getDiscount(double originalPrice) {
				System.out.println("使用VIP打折");
				return originalPrice*0.5;
		}
}
public class OldDiscount  implements DiscountStrategy{
		//提供旧物品的打折算法
		public double getDiscount(double originalPrice) {
				System.out.println("使用旧物品打折");
				return originalPrice*0.8;
		}
}

//提供一个DiscountContext用于调用者选择合适的折扣策略

public class DiscountContext {
		private DiscountStrategy strategy;

		public DiscountContext(DiscountStrategy strategy) {
				this.strategy = strategy;
		}
		
		public double getDiscountPrice(double price){
				//if promo strategy not be specified, a default strategy is provided
				if(strategy == null){
						strategy = new OldDiscount();
				}
				return strategy.getDiscount(price);
		}
		
		//Implement toggling strategy
		public void changeDiscount(DiscountStrategy strategy){
				this.strategy = strategy;
		}
}

测试类:

public class DiscountTest {
		public static void main(String[] args) {
				//不指定策略,则使用默认的策略模式
				DiscountContext context = new DiscountContext(null);
				double originalPrice1 = 80;
				context.getDiscountPrice(originalPrice1);
				
				//选择vip折扣
				context.changeDiscount(new VipDiscount());
				double originalPrice2 =101;
				context.getDiscountPrice(originalPrice2);
			
		}
}

相关推荐