Groovy探索 自定义Range 二 自定义Range类与Decorate模式(上)
来源:互联网 发布:编程专家的微视频 编辑:程序博客网 时间:2024/06/06 02:10
Groovy探索 自定义Range 二 自定义Range类与Decorate模式
Decorate模式相信大家都比较熟悉了,是一个"BangOfFour"中最常用的模式之一,实现起来也相当的简单。如果有人不熟悉的话,可以看看《Groovy探索之Decorate模式》,那里面有一个本篇要沿用的例子。
这个例子就是咖啡馆里买咖啡的经典例子,咖啡有原味咖啡,还有根据顾客口味不同进行各种添加,比如加冰、加奶和加糖等等。顾客可以选择不加、加一样或加多样,各种加法的咖啡所买的价格也不一样。
这个例子是Decorate模式实现的最经典的例子。我们在这里希望使用自定义Range类来实现它。
我们首先要定义一个基类来实现自定义的Range,其他所有的咖啡类型都是它的子类,这样,我们所有的咖啡类型就都拥有了Range类的特性。先来来看这个基类:
package range;
class Base implements Comparable{
static protected types = ['Coffee','Ice','Milk','Sugar']
protected int index = 0
protected type
protected getIndex()
{
this.index = this.types.indexOf(type)
}
def next()
{
Factory.getObject(types[(index+1)%types.size()])
}
def previous()
{
Factory.getObject(types[index-1])
}
int compareTo(Object other)
{
index<=>other.index
}
}
在这个基类中,变量"types"是所有的咖啡类型。其他的,如"index"变量,"next"、"previous"和"compareTo"方法,它们的逻辑都和一般的自定义Range类的那些变量和方法一样。
"type"变量和"getIndex()"是为了方便"Base"类的子类而定义的,也就是说,在"Base"类的子类中,我们不用管下面的语句是干什么用的:
this.index = this.types.indexOf(type)
因为子类的对象在"Base"类中不可预期,因此,我们使用了一个工厂方法来使得自定义的Range类能够获取到遍历的子类对象。如下:
Factory.getObject(types[(index+1)%types.size()])
或者:
Factory.getObject(types[index-1])
下面,我们来看看工厂类:
package range;
class Factory {
static def getObject(type)
{
Class clazz = Class.forName("range.${type}")
return clazz.newInstance()
}
}
也很简单,就是通过咖啡类型来获取咖啡对象。
下面,就该轮到我们各个咖啡类出场了:
package range;
class Coffee extends Base{
def Coffee()
{
this.type = 'Coffee'
this.getIndex()
}
def description()
{
'Coffee'
}
def price()
{
10
}
}
上面是原味咖啡的类实现,它继承了"Base"类,在构造器里,它首先给"type"对象赋值"Coffee",然后调用"getIndex"方法,目的是设置该类的在Range中的当前位置。其他的两个方法"description"和"price"方法,就与自定义的Range类没有关系了,是我们的咖啡系列的逻辑要用到的方法。
其他的几个咖啡类跟原味咖啡的实现一样。下面的是"Ice"类:
package range;
class Ice extends Base{
def Ice()
{
this.type = 'Ice'
this.getIndex()
}
def description()
{
'with ice'
}
def price()
{
1
}
}
接着是"Milk"类:
package range;
class Milk extends Base{
def Milk()
{
this.type = 'Milk'
this.getIndex()
}
def description()
{
'with milk'
}
def price()
{
5
}
}
最后是"Sugar"类:
package range;
class Sugar extends Base{
def Sugar()
{
this.type = 'Sugar'
this.getIndex()
}
def description()
{
'with sugar'
}
def price()
{
3
}
}
这些类都很简单,没有多余的逻辑。
下面,我们就可以来使用这个自定义的Range类了,比如一个顾客希望他的咖啡加冰、加奶、加糖。那么,我们就可以这样实现了:
def coffee = new Coffee()
def sugar = new Sugar()
def description = ''
(coffee..sugar).each{
description += it.description()+' '
}
println description
运行结果为:
Coffee with ice with milk with sugar
- Groovy探索 自定义Range 二 自定义Range类与Decorate模式(上)
- Groovy探索 自定义Range 二 自定义Range类与Decorate模式(下)
- Groovy探索 自定义Range 三 自定义Range与责任链模式
- Groovy探索 自定义Range 一 一个简单的自定义Range类
- Groovy探索 自定义Range 一 一个简单的自定义Range类
- Groovy探索之Decorate模式
- groovy Range
- 自定义 C++ 中的 range() 函数
- groovy的集合 Range
- Groovy入门(二)——集合类型-Range
- 如何使用自定义的 number range objects
- 如何使用自定义的 number range objects
- 如何使用自定义的 number range objects
- Guava中RangeMap自定义range区间
- h5自定义滚动条的样式range
- Groovy探索之Delegate模式 二
- Range
- Range
- Apache对JavaEE 6说“不”
- HOWTO: FreeBSD with CCACHE
- 系统程序员成长计划-工程管理(四)
- 简易同学录JSP实现
- C++产生随机序列 斗地主高效分牌算法
- Groovy探索 自定义Range 二 自定义Range类与Decorate模式(上)
- 行万里路,不如明师开悟——leo简历工作室能做点啥?
- Groovy探索 自定义Range 二 自定义Range类与Decorate模式(下)
- 数据集成之主数据管理(一)基础概念篇 (转贴)
- 基于Eclipse RCP 做的一个成绩管理统计平台 例子----连载2
- 25大永留历史的IT产品:MS-Dos等榜上有名
- atexit函数
- 数据库中添加表的约束(Including Constraints)
- C语言时间函数应用