1700465874
❑它是一个浓缩了的策略模式的枚举。
1700465875
1700465876
当然,读者可能要反思了,我使用内置类也可以实现相同的功能,写一个Context类,然后把抽象策略、具体策略都内置进去,不就可以解决问题了,是的,可以解决,但是扩展性如何?可读性如何?代码是让人读的,然后才是让机器执行,别把顺序搞反了!
1700465877
1700465878
我们继续完善方案四,场景类稍有改动,如代码清单18-19所示。
1700465879
1700465880
代码清单18-19 场景类
1700465881
1700465882
public class Client{
1700465883
1700465884
public static void main(String[]args){
1700465885
1700465886
//输入的两个参数是数字
1700465887
1700465888
int a=Integer.parseInt(args[0]);
1700465889
1700465890
String symbol=args[1];//符号
1700465891
1700465892
int b=Integer.parseInt(args[2]);
1700465893
1700465894
System.out.println(“输入的参数为:”+Arrays.toString(args));
1700465895
1700465896
System.out.println(“运行结果为:”+a+symbol+b+”=”+Calculator.ADD.exec(a,b));
1700465897
1700465898
}
1700465899
1700465900
}
1700465901
1700465902
运行结果与方案一相同。看这个场景类,代码量非常少,而且还有一个显著的优点:真实地面向对象,看看这条语句:
1700465903
1700465904
Calculator.ADD.exec(a,b)
1700465905
1700465906
是不是类似于“拿出计算器(Calculator),对a和b进行加法运算(ADD),并立刻执行(exec)”,这与我们日常接触逻辑是不是非常相似,这也正是我们架构师要担当的职责!
1700465907
1700465908
注意 策略枚举是一个非常优秀和方便的模式,但是它受枚举类型的限制,每个枚举项都是public、final、static的,扩展性受到了一定的约束,因此在系统开发中,策略枚举一般担当不经常发生变化的角色。
1700465909
1700465910
1700465911
1700465912
1700465914
设计模式之禅 18.5 最佳实践
1700465915
1700465916
策略模式是一个非常简单的模式。它在项目中使用得非常多,但它单独使用的地方就比较少了,因为它有致命缺陷:所有的策略都需要暴露出去,这样才方便客户端决定使用哪一个策略。例如,在例子中的赵云,赵云实际上不知道使用哪个策略,他只知道拆第一个锦囊,而不知道是BackDoor这个妙计。是的,诸葛亮已经在规定了在适当的场景下拆开指定的锦囊,我们的策略模式只是实现了锦囊的管理,但是我们没有严格地定义“适当的场景”拆开“适当的锦囊”,在实际项目中,我们一般通过工厂方法模式来实现策略类的声明,读者可以参考混编模式。
1700465917
1700465918
1700465919
1700465920
1700465922
设计模式之禅 第19章 适配器模式
1700465923
[
上一页 ]
[ :1.700465874e+09 ]
[
下一页 ]