设计模式学习笔记---策略模式strategy pattern(Java版)
2015-03-13 22:51
621 查看
一、场景
市场人员接到单之后的报价策略,比如普通用户或老客户,还是小批量或大批量。
二、实质
策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新的算法。并且由客户端决定调用那个算法。(分离算法,选择实现。)
三、示例
1、未使用策略模式
2、策略模式
运行结果:
打八折
你的报价:798.4000000000001
四、开发场景
Java SE中GUI编程中,布局管理
Spring框架中,Resource接口,资源访问策略
javax.servlet.http.HttpServlet#service()
市场人员接到单之后的报价策略,比如普通用户或老客户,还是小批量或大批量。
二、实质
策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新的算法。并且由客户端决定调用那个算法。(分离算法,选择实现。)
三、示例
1、未使用策略模式
package com.lgd.strategy; /** * 实现容易,但是代码变多之后,难于维护。 * 如果有增长类型,就需要频繁修改此处的代码! * 不符合开闭原则 * @author liguodong * */ public class nostrategy { public double getPrice(String type, double price){ if(type.equals("普通客户小批量")) { System.out.println("不打折"); return price; } else if(type.equals("普通客户大批量")){ System.out.println("打九折"); return price*0.9; }else if(type.equals("老客户小批量")){ System.out.println("打八五折"); return price*0.85; }else if(type.equals("老客户大批量")){ System.out.println("打八折"); return price*0.8; } return price; } }
2、策略模式
package com.lgd.strategy; public interface Strategy { public double getPrice(double standardPrice); }
package com.lgd.strategy; public class NewCustomerFewStrategy implements Strategy{ @Override public double getPrice(double standardPrice) { System.out.println("不打折"); return standardPrice; } }
package com.lgd.strategy; public class NewCustomerManyStrategy implements Strategy{ @Override public double getPrice(double standardPrice) { System.out.println("打八折"); return standardPrice*0.8; } }
package com.lgd.strategy; public class OldCustomerFewStrategy implements Strategy{ @Override public double getPrice(double standardPrice) { System.out.println("不打折"); return standardPrice; } }
package com.lgd.strategy; public class OldCustomerManyStrategy implements Strategy{ @Override public double getPrice(double standardPrice) { System.out.println("打八折"); return standardPrice*0.8; } }
package com.lgd.strategy; /** * 负责和具体的策略类交互 * 这样,具体的算法九直接和客户端调用分离了,使得算法可以独立于客户端独立的变化。 * 如果使用spring的依赖注入功能还可以通过配置文件,动态的注入不同策略对象,动态的切换不同的算法。 * @author liguodong * */ 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 printPrice(double s) { System.out.println("你的报价:"+strategy.getPrice(s)); } }
package com.lgd.strategy; public class Client { public static void main(String[] args) { Strategy s1 = new OldCustomerManyStrategy(); Context ctx = new Context(s1); ctx.printPrice(998); } }
运行结果:
打八折
你的报价:798.4000000000001
四、开发场景
Java SE中GUI编程中,布局管理
Spring框架中,Resource接口,资源访问策略
javax.servlet.http.HttpServlet#service()
相关文章推荐
- Java-马士兵设计模式学习笔记-策略模式-模拟 Comparator接口
- java 设计模式学习笔记十五 strategy 策略设计模式
- java设计模式学习笔记之策略模式
- 学习笔记——JAVA设计模式<18>策略模式
- 【Java23种设计模式学习笔记】一:策略模式
- java 设计模式学习笔记十五 strategy 策略设计模式
- 设计模式学习笔记之策略模式(Java实现)
- java/android 设计模式学习笔记(17)---策略模式
- Java-马士兵设计模式学习笔记-策略模式-模拟Comparable接口
- java学习笔记-设计模式14(策略模式)
- java 设计模式 学习笔记(4) 策略模式
- JAVA与模式学习笔记之设计原则
- java 设计模式 学习笔记 (14) 备忘录模式
- java 设计模式 学习笔记(9) 模板方法模式
- 设计模式学习笔记(一):策略模式
- java 设计模式学习笔记(8) - 原型模式
- java 设计模式 学习笔记(11) 建造者模式
- java 设计模式 学习笔记(15) 组合模式
- java 设计模式 学习笔记(3) 抽象工厂模式
- 设计模式学习笔记之(二、策略模式)