欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式-策略模式

程序员文章站 2022-07-13 15:02:39
...

一、策略模式

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

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

 

策略模式跟模板模式确实有一点像,但是区别还是比较明显的,有必要的话看下上一篇博客设计模式-模板模式(http://zyqwst.iteye.com/admin/blogs/2285300/)。

    

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

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

}

 

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

相关标签: 策略模式