GOF23设计模式之策略模式与实现
2015-04-15 20:26
736 查看
策略模式strategy
场景:
某个市场人员接到单后的报价策略。报价策略很负责,可以简单做如下分类:
普通客户小批量
普通客户大批量
老客户小批量
老客户大批量
具体选用那个报价策略,需要根据实际情况来定,这时候,我们采用策略模式即可。
本质:
分离算法,选择实现。
开发中常见的场景:
JAVASE中GUI编程中,布局管理
Spring框架中,Resource接口中,资源访问策略
==============================================
/**
* 传统实现方式 * 做起来比较容易,符合一般开发人员的思路。 * 假如类型特别多,算法比较复杂整个条件语句的代码变得很长,难于维护 * 如果有新增类型,就需要频繁的修改这段代码,不符合开闭原则。 * */ package com.bjsxt.cn.strategy;
public class TestStrategy { 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.8; } else if (type.equals("老客户大批量")) { System.out.println("打七折"); return price * 0.7; } return price; } }
=========================================
/** * 抽象策略接口 */ package com.bjsxt.cn.strategy;
public interface Strategy { public double getPrice(double oldPrice); } ===========================================
/** * 2015年4月15日09:45:41 * 处理的是新客户小批量 */ package com.bjsxt.cn.strategy;
public class NewCustomerFew implements Strategy {
@Override public double getPrice(double oldPrice) { System.out.println("新客户小批量,不打折"); return oldPrice; } }
============================================
/** * 2015年4月15日09:47:32 * 新客户大批量,九折 */ package com.bjsxt.cn.strategy;
public class NewCustomerLarge implements Strategy {
@Override public double getPrice(double oldPrice) { System.out.println("新客户大批量,九折"); return oldPrice * 0.9; }
} ==============================================
/** * 一种打折策略,老客户小批量, 七折 * 2015年4月15日09:49:12 */ package com.bjsxt.cn.strategy;
public class OldCustomerFew implements Strategy {
@Override public double getPrice(double oldPrice) { System.out.println("老客户小批量, 七折"); return oldPrice * 0.7; } } =================================================
/** * 老客户大批量,七折 * 2015年4月15日09:51:48 */ package com.bjsxt.cn.strategy;
public class OldCustomerLarge implements Strategy {
@Override public double getPrice(double oldPrice) { System.out.println(" 老客户大批量,六折"); return oldPrice * 0.6; } } ===================================================
/** * 需要用到不同打折策略的上下文 */ package com.bjsxt.cn.strategy;
import java.awt.print.Printable;
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 oldPrice) { double discountedPrice = strategy.getPrice(oldPrice); System.out.println(discountedPrice); } } ========================================
/** * 客户程序 * 策略模式对英语解决某一个问题的一个算法组, * 允许用户从该算法族中任选一个算法解决某一问题, * 同时可以方柏霓的更换算法或者增加新的算法。 * 并且由客户端决定调用那个算法。 * * 客户端负责和具体的策略类进行交互。 * 这样的话,具体的算法和直接的客户段调用分离了,使得算法可以独立于客户端独立的变化。 * 如果使用Spring的依赖注入功能,还可以通过配置文件,动态的注入不同的策略对象,动态切换不同的算法。 * */ package com.bjsxt.cn.strategy;
public class Client { public static void main(String[] args) { Strategy strategy = new OldCustomerFew(); Context ctx = new Context(strategy); ctx.PrintPrice(900); ctx.setStrategy(new NewCustomerFew()); ctx.PrintPrice(900); ctx.setStrategy(new OldCustomerLarge()); ctx.PrintPrice(900); } } /* 老客户小批量, 七折 630.0 新客户小批量,不打折 900.0 老客户大批量,六折 540.0
* */
==========================================
相关文章推荐
- GOF23设计模式之状态模式的理解与实现
- GOF23设计模式之模板方法模式(方法回调)的理解与实现之经典
- 【GOF23设计模式】_命令模式_数据库事务机制底层架构实现_撤销和回复JAVA246
- 233_尚学堂_高淇_java300集最全视频教程_【GOF23设计模式】_原型模式_prototype_浅复制_深复制_反序列化实现深复制
- GOF23设计模式之原型模式之实现
- 【GOF23设计模式】_中介者模式_同事协作类_内部类实现JAVA245
- GOF23设计模式之享元模式的实现
- GOF23设计模式之外观模式不使用外观模式的实现
- 设计模式GOF23——策略模式
- 【GOF23设计模式】策略模式
- 设计模式GOF23之单例模式实现
- 【GOF23设计模式】_策略模式_CRM中报价策略_GUI编程中布局管理器底层架构JAVA248
- GOF23设计模式之迭代器模式理解与实现
- GOF23设计模式之中介者模式的实现
- GOF23设计模式之组合模式之实现
- GOF23设计模式之责任链模式(chain of responsibility)之实现
- GOF23设计模式之抽象工厂模式的实现
- GOF23设计模式之静态代理模式实现之经典
- GOF23设计模式之动态代理模式实现之经典
- GOF 23 设计模式之 观察者模式(Observer)