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:很喜欢那种“轻量”灵活的函数定义和函数式编程,作者花了很多心思在推断和简化上是很有成效的 |