因为之前在的北京一家做银行系统的公司用的语言主要是python,所以对于java的理解还停留在毕业时的水平(惭愧);
为了加深对于java的理解也为了工作的需要,更是为了切换面向过程与面向对象编程思想之间切换,打算从Java的设计模式作为切入点进行学习。
开这一系列博客的作用主要是记录我对于设计模式的学习过程与理解。
话不多说,今天学习是策略模式。
定义:
我理解的策略模式是解决一类型问题的不同策略的封装集合,易于策略切换与策略扩展,符合开闭原则。
例子:
某天博主去苏宁买电器有活动,某些电器是打八折的,有些电器是花满2000元返利1000元(我是不是想多了);这时需要营业员通过下拉框去选择折扣类型,通过类型来选择打折的策略得到最后应该付的金额。
我们发现解决卖电器结算活动这个问题有两个策略,一种是打折一种是返利。
所以我们的代码是这样的:
一、抽象一个类型的问题的策略
public abstract class strategy { public abstract double discount(double cost); }
二、具象化不同的策略
//打折
public class strategyA extends strategy { private double rate; public strategyA(double rate){ this.rate = rate; } @Override public double discount(double cost) { return cost * rate; } }
//返利
public class strategyB extends strategy { private double standard; private double rebate; public strategyB(double standard,double rebate){ this.rebate = rebate; this.standard = standard; } @Override public double discount(double cost) { if (cost > standard){ return cost-rebate; }else{ return cost; } }
注:上面我们的策略的集合就出来了,如果又出现了另一个活动方式比如买两件送礼品什么的祝需要继承strategy 类就可以了,很方便,而且这些策略之间互不影响。
三、定义活动类型
public enum kind {
rebate2000back1000,discount8; }
注:为什么博主用enum,因为博主用的是jdk1.6,switch不支持字符串。
四、上下文可以理解为controller
public class context { private strategy strategy = null; public context(kind kind){ switch(kind){ case rebate2000back1000: this.strategy = new strategyB(2000,1000); break; case discount8: this.strategy = new strategyA(0.8); break; } } public double count(double cost){ return strategy.discount(cost); } }
注:细心的小伙伴会发现还偷偷用了工厂模式,这样可以减轻前端的负担,不需前端要去switch判断。
五、模拟前端调用
public class app { public static void main(String[] args) { context contextA = new context(my170413.celue.kind.discount8); System.out.println(contextA.count(100)); context contextB = new context(my170413.celue.kind.rebate2000back1000); System.out.println(contextB.count(3000)); } }
