策略模式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
*
*/
==========================================