设计模式-策略模式

风吹夏天 2016-03-30

一、策略模式

                                                                              ——我一直不太信任自己的记忆力,所以我把它们都写下来 

 23种设计模式基本上都是在大量的实践经验中抽象出来的,虽然我们目前经验还没能达到那种程度,但是一定的时间后翻看设计模式,发现有一部分似曾相识,这不就是我常用的吗?是不是内心一阵窃喜啊。

    

策略模式:策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。

定义看起来比较抽象,直白来说就是把一系列不同的算法封装到具有共同接口的实现类中。调用者根据情境调用不同的实现类。下面类图中,调用者根据需求选择调用StrategyA或StratebyB。


设计模式-策略模式
 

下面看一个Demo:某商品按照顾客Customer,会员VIP,超级会员SVIP有不同的打折力度;分别是不打折、减10%,减20%。根据顾客计算相应的价格。

/**
 * 价格类
 * @author albert
 *
 */
public class Price {
	/**假设商品单价为10元*/
	private Double price=10.00d;
	/**
	 * 按照顾客类型返回实际单价
	 * @param discount 打折策略
	 * @return
	 */
	public Double actualPrice(Discount discount){
		return price*discount.getDiscount();
	}
}


/**打折接口*/
public interface Discount {
	public Double getDiscount();
}

/**会员打折*/
public class VipDiscount implements Discount{
        public Double getDiscount(){
               return 0.9d;
        }
}

/**超级会员打折*/
public class SVipDiscount implements Discount{
        public Double getDiscount(){
               return 0.8d;
        }
}


/**普通顾客不打折*/
public class MemberDiscount implements Discount{
        public Double getDiscount(){
               return 1d;
        }
}

 打折接口Discount;根据三种客户类型有三种打折实现。下面是测试类

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Price price = new Price();
		Double actualPrice = price.actualPrice(new VipDiscount());//假设是会员,打9折
                System.out.println(actualPrice);//结果是9
	}

}

从例子可以得出结论:算法的选择是平等的,算法的选择完全依赖于调用者当时的情境。策略模式的侧重不是算法的实现,而是对这些算法如何组织和调用。从而让程序更加灵活,具有更好的维护性和扩展性。这也是策略模式相对于模板方法模式的一大区别。

相关推荐