scala:特质(trait)类似于装饰者模式?

drift_ice 2009-10-26

abstract class Apple{
    def name:String
}

class Apple1(s:String) extends Apple{
    def name:String=s
}

trait DoubleName extends Apple{
    abstract override def name:String={
        super.name * 2
    }
}

class DApple(s:String) extends Apple1(s) with DoubleName{}
这样用:
(new DApple("troy")).name

这里面特质如果用类写成
class DoubleName2(apple:Apple) extends Apple{
    abstract override def name:String={
        apple.name * 2
    }
}
这样用:
(new DoubleName2(new Apple1("troy"))).name

而特质跟装饰类DoubleName2看起来起到同样的做样,不同的是特质需要为每一种装饰的组合定义一个新的类,而装饰模式是对对象的装饰,看起来似乎更灵活
某种程度上,特质这一词就字面理解感觉就是为类增加一些新的功能,或改变原有的一些功能,那么跟装饰者的目的其实很像。

理解比较肤浅,不知各位有什么理解
fineqtbull 2009-10-26
的确特征(trait)在功能混入方面和装饰者模式有相似之处,都是为已有的类增加了新的功能。但是两者在实现方式上还是有本质上区别的,装饰者模式使用的是对象组合方法,是框架层次的解决方案,而特征用的是多重继承方式,是语言层次的解决方案。
具体来说,装饰者模式通过在已有对象上外包一个对象来增加功能,所以每增加一个功能都要多包一个对象,是将多个对象组合在一起的方式。而特征则是通过多重继承来加入功能的,所以无论增加多少层次的功能,在内存模型上都是一个对象,而且通过super语句的顺序调用来调整不同层次功能的调用(或包含)顺序,也同时解决了多层继承中的菱形继承问题。
所以Scala的特征可以说是在语言层面上实现了装饰者(Decorator)和模板方法(Template Method)模式,并且具有静态的性质,所以更直观也更节省内存。附带提一下,多层次的功能增加可以说是面向方面编程的一个核心功能,这也是AspectJ和Spring的Inspector所实现的,Scala的特征可以说是在语言层面实现了这些功能。
drift_ice 2009-10-26
说的在理
trait实现面向方面是要方便很多
scala有很多好用的特性,但是感觉这些特性需要有一些设计模式或最佳实践来指导一下
PS:很喜欢那种“轻量”灵活的函数定义和函数式编程,作者花了很多心思在推断和简化上是很有成效的
Global site tag (gtag.js) - Google Analytics