我们将会创建5个类,Context策略类,CashSuper抽象策略,Zhengchang正常收费类,Dazhe打折收费类。
Context和CashSuper为聚合关系;CashSuper派生出Zhengchang和Dazhe俩类
概念性的描述:策略模式是一种定义一系列算法的方法,这些算法都是做相同的事情,只是实现不同(正常出售和打折出售),它做的就是以相同的方式做不同的事情(不管是打折还是正常都是通过收费这个抽象接口调用),减少各种算法和使用算法类之间的耦合关系(这样做从正常收费切换到打折收费只需要改变某种策略就行,不需要大动干戈);
策略模式的CashSuper类为Context提供一系列可重用的算法或行为,继承有利于有利于析取这些算法中的公共功能。(打折和正常我们都可以通过CashSuper类中的抽象方法获取想要的算法)。
策略模式就是用来封装算法的,我们几乎可以用它封装任何类型的规则,只要听见需要在不同的情况下处理不同的事情就可以考虑策略模式。(下面会有用户只需要在客户端选择一种方式,我们便可以为它生成想要的结算方式,大大减轻了客户端的压力,完全不需要让客户端知道Zhengchang和Dazhe这俩类,只需要知道Context类,并知道以何种方式使用这个类进行想要的结算便好,同时客户端也没有过多的判断)//偷个懒就不画图了
--看完代码后看下面这段话
如果不用策略模式我们会不会再客户端创建Abssum类,如果你在客户端创建这个类你就得在客户端添加switch算法,这样才足以让你得到你想要的计算方式。就回到上面说的你的客户端程序员需要知道CashSuper抽象策略,Zhengchang正常收费类,Dazhe打折收费类这三个。如果增加打折方式,客户端程序员还需要在前端大量维护打折的算法,后端也需要大量维护打折算法。如果是策略模式,前端程序员只需要知道Context这一个类。就算增加打折功能,前端程序员只需要在前端添加dazhe字符串,后端根据传来的字符串进行判断,也就是减轻客户端压力,后台增加极少压力。
//客户端
public class Kehuduan{
public static void main(String[] args) {
int a = 1;
int b = 2;
Double i=0.0;
int ii=5;
//1调用策略类,并告诉策略类我们的结账为满减结账
Context cc = new Context("manjian");
//3通过Context调用计算方法
i =cc.sum(a,b);
System.out.println("商品单价:"+a+"商品总数为:"+b+"商品总和为:"+i);
}
}
//策略类
public class Context {
Abssum abssum=null;
//2.策略类发现有人要调用我,并且告诉我满减,那我经过某种算法返回他想要的东西(Manjian)
//这里要看懂就要了解java的多态,我们将会通过向上转型将所有导出类转型为父类。
//大概说下其中的机制是java的动态绑定。方法调用的后期绑定,也就是说编译器一直不知道对象的类 //型,但是方法调用机制能找到正确的方法体,并加以调用。
public Context(String leixing){
switch (leixing){
case "manjian":
this.abssum = new Manjian();break;
case "zhengchang":
this.abssum = new Zhengchang();break;
}
}
//4有人调用我,我通过动态绑定机制找到了想要的方法并返回正确的数字
public Double sum(int a,int b){
return abssum.sum(a,b);
}
}
//抽象类
public abstract class Abssum {
public abstract Double sum(int a,int b);
}
//派生类1
public class Zhengchang extends Abssum {
/*计算总和*/
@Override
public Double sum(int a,int b){
Double sum = Double.valueOf(a*b);
return sum;
}
}
//派生类2
public class Manjian extends Abssum {
@Override
public Double sum(int a,int b) {
int j = a+b;
Double sum = Double.valueOf(a+b);
if (a+b<3)
return sum;
return sum-0.5;
}
}