【行为型模式】策略模式(Strategy)之23种java设计模式

来源:互联网 发布:第一初恋网络剧第一季 编辑:程序博客网 时间:2024/04/25 09:34

常规场景分析和实现:


TestStrategy

/** * 实现起来比较容易,符合一般开发人员的思路 * 假如,类型特别多,算法比较复杂时,整个条件语句的代码就变得很长,难于维护。 * 如果有新增类型,就需要频繁的修改此处的代码! * 不符合开闭原则! * @author Administrator * */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.85;} else if (type.equals("老客户大批量")) {System.out.println("打八折");return price * 0.8;}return price;}}

策略模式实现:



Strategy接口

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

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

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

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

Context类负责和具体的策略类交互
 * 这样的话,具体的算法和直接的客户端调用分离了,使得算法可以独立于客户端独立的变化。
 * 如果使用spring的依赖注入功能,还可以通过配置文件,动态的注入不同策略对象,动态的切换不同的算法.

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));}}

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


0 0
原创粉丝点击