加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy探索 自定义Range 二 自定义Range类与Decorate模式(上)

发布时间:2020-12-14 17:09:08 所属栏目:大数据 来源:网络整理
导读:??????? Groovy探索 自定义Range 二 自定义Range类与Decorate模式 ? ? Decorate模式相信大家都比较熟悉了,是一个"BangOfFour"中最常用的模式之一,实现起来也相当的简单。如果有人不熟悉的话,可以看看《Groovy探索之Decorate模式》,那里面有一个本篇要沿

??????? 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读