策略模式

来源:互联网 发布:无人机遥控软件 编辑:程序博客网 时间:2024/06/02 05:11

本质:分离算法,选择实现

场景javase中GUI编程中,布局管理器;spring框架中,resoyrce接口,资源访问策略;javax.servlet.http.httpservlet#service()

例子:比如商城打折,老用户新商品打9折,老用户老商品打8折,新用户新商品减10元,新用户老商品减20元

Strategy.java(策略类)

public interface Strategy {public double getPrice(double  standardPrice);}

OldCustomerManyStrategy.java

public class OldCustomerManyStrategy implements Strategy {@Overridepublic double getPrice(double standardPrice) {System.out.println("打八折");return standardPrice*0.8;}}


OldCustomerFewStrategy.java

public class OldCustomerFewStrategy implements Strategy {@Overridepublic double getPrice(double standardPrice) {System.out.println("打八五折");return standardPrice*0.85;}}

NewCustomerManyStrategy.java

public class NewCustomerManyStrategy implements Strategy {@Overridepublic double getPrice(double standardPrice) {System.out.println("打九折");return standardPrice*0.9;}}


NewCustomerFewStrategy.java

public class NewCustomerFewStrategy implements Strategy {@Overridepublic double getPrice(double standardPrice) {System.out.println("不打折,原价");return standardPrice;}}


Context.java

/** * 负责和具体的策略类交互 * 这样的话,具体的算法和直接的客户端调用分离了,使得算法可以独立于客户端独立的变化。 * 如果使用spring的依赖注入功能,还可以通过配置文件,动态的注入不同策略对象,动态的切换不同的算法. * @author Administrator * */public class Context {private Strategy strategy;//当前采用的算法对象//可以通过构造器来注入public Context(Strategy strategy) {super();this.strategy = strategy;}//可以通过set方法来注入public void setStrategy(Strategy strategy) {this.strategy = strategy;}public void pringPrice(double s){System.out.println("您该报价:"+strategy.getPrice(s));}}


测试

public class Client {public static void main(String[] args) {Strategy s1 = new OldCustomerManyStrategy();Context ctx = new Context(s1);ctx.pringPrice(998);}}

注意:如果使用ifelse,实现起来比较容易,符合一般开发人员的思路,假如,类型特别多,算法比较复杂时,整个条件语句的代码就变得很长,难于维护。如果有新增类型,就需要频繁的修改此处的代码!不符合开闭原则!

原创粉丝点击