技术之大,在乎你我心中

策略模式的扩展——策略枚举

     各位,我给大家出个小学的题目:输入3个参数,进行加减法运算,参数中两个是int型的,剩下的一个参数是String型的,只有“+”,“-”两个符号可以选择,不要考虑什么复杂的校验,我们做的是白箱测试,输入的就是标准的int类型和合规的String类型,各位大侠,想想看,怎么做,简单得很!
    有非常多的实现方式,我今天来说四种,先说第一种,写一个类,然后进行加减法运算,类图也不用画了,太简单了,直接看代码:

 

策略枚举
 
public enum Calculator { 
//加法运算 
ADD("+"){ 
public int exec(int a,int b){ 
return a+b; 

}, 
//减法运算 
SUB("-"){ 
public int exec(int a,int b){ 
return a - b; 

};
String value 
= ""
//定义成员值类型 
private Calculator(String _value){ 
this.value = _value; 

//获得枚举成员的值 
public String getValue(){ 
return this.value; 

//声明一个抽象函数 
public abstract int exec(int a,int b); 
}
 

 

 

     先想一想它的名字,为什么叫做策略枚举?枚举没有问题,它就是一个Enum类型,那为什么又叫做策略呢?找找看能不能找到策略的影子在里面,是的,我们定义了一个抽象的方法exec,然后在每个枚举成员中进行了实现,如果不实现呢?你试试看看,不实现该方法就不能编译,现在是不是清楚了?把原有定义在抽象策略中的方法移植到枚举中,每个枚举成员就成为一个具体策略。简单吧,总结一下,策略枚举就是这样一个枚举:

  • 它是一个枚举。

  • 它是一个浓缩了的策略模式的枚举。

    当然,各位可能要反思了,我使用内置类也可以实现相同的功能,写一个Context类,然后把抽象策略、具体策略都内置进去,不就可以解决问题了,是的,可以解决,但是扩展性如何?可读性如何?代码是让人读的,然后才是让机器执行,别把顺序搞反了!

 

标签: 设计模式

posted on 2010-03-17 23:39 cbf4life 阅读(1554) 评论(8) 编辑 收藏

评论

#1楼 2010-03-18 01:04 winter-cn      

策略模式可变的是算法
"+" "-" "*" "/" 不是做同一件事情的不同算法 所以你这里不是策略模式
 回复 引用 查看   

#2楼 2010-03-18 08:48 小丁的博客      

上面的写法能通过编译吗?我copy到程序中怎么总是报错?
 回复 引用 查看   

#3楼 2010-03-18 08:55 木色      

这应该是一个模板模式(抽象关键算法),
同意一楼说法。
 回复 引用 查看   

#4楼[楼主] 2010-03-18 09:08 cbf4life      

@winter-cn
策略模式的定义: 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。

策略枚举两层含义都包含了:
1、封装了两个算法,+和—;
2、可以互换;

策略枚举其实已经包纳了策略模式的Context、Strategy、ConcreteStrategy,你可以想想,如果按照普通的策略模式,该怎么写。
 回复 引用 查看   

#5楼[楼主] 2010-03-18 09:13 cbf4life      

@小丁的博客
以性别担保,不出错。jdk 1.5以上了没?

或者把你的代码发给我,cbf4life@126.com,我看看。
 回复 引用 查看   

#6楼 2010-03-18 10:02 小丁的博客      

@cbf4life
谢谢你的回复,代码已经能够运行成功了,主要原因是我对枚举的构造不太熟悉。
 回复 引用 查看   

#7楼 2010-03-18 11:19 gihelo      

实际是模板模式
而且本身也可以不用枚举。用字典类和泛型委托也可以,而且更灵活一点

比如我用c#的写法是

Dictionary<string, Func<int, int,int>> tokens = new Dictionary<string, Func<int, int,int>>();
tokens.Add("+", (a, b) => a + b);
var res=tokens["+"](1, 2);
 回复 引用 查看   

#8楼[楼主] 2010-03-18 13:12 cbf4life      

@gihelo
模板方法模式(Template Method Pattern)?模板方法模式是“可以不改变一个算法的结构即可重定义该算法的某些特定步骤”,注重如何改变算法的效能,而策略模式则注重的算法之间的相互替换。

这样说,如果Calculator是个抽象类,定义一个exec方法,然后有两个具体的算法策略Add和Sub,那这是不是策略模式呢?

那如果是模板方法模式会是怎么样呢?在Calculator中只有基本方法exec,而没有模板方法,你的子类是完全重写的算法,因为父类没有定义算法骨架,何来“不改变算法的结构”?
 回复 引用 查看   

导航

统计

常用链接

我的标签

随笔档案

积分与排名

最新评论

阅读排行榜

评论排行榜

推荐排行榜