策略(Strategy)模式 (转)
策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换, 策略模式可以在不影响到客户端的情况下发生变化。
一、策略模式涉及到的角色;
1、环境(Context)角色:持有一个Strategy类的引用。
2、抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需要的接口。
3、具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
//环境角色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;}}//具体折扣类1(没有折扣)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;}}//具体折扣类2public 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;}}//具体折扣类3public 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;}}