And*_*yuk 4 java scala composite
在java中我可以实现复合设计模式如下:
interface Component{
void operation();
}
class Composite implements Component{
@override
public void operation(){
for(Child child in children){
child.operation();
}
}
public void add(Component child){//implementation}
public void remove(Component child){//implementation}
public void getChild(int index);
}
class Leaf implements Component{
@override
public void operation(){
//implementation
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能用scala编写它?特别是我无法理解如何编写接口并实现它?
在 Scala 中,没有任何具体方法的 Trait 只是一个接口。所以直接翻译就是:
trait Component { def operation(): Unit }
class Composite extends Component {
def operation() = children foreach { _.operation() }
def add(child: Component) = ...
def remove(child: Component) = ...
def getChild(index: Int) = ...
}
class Leaf extends Component {
def operation() = ...
}
Run Code Online (Sandbox Code Playgroud)
不过,如果您想要更惯用的 Scala,我会推荐类似这样的定义Composite:
class Composite extends Component {
def operation() = children foreach { _.operation() }
def +=(child: Component) = ...
def -=(child: Component) = ...
def apply(index: Int) = ...
}
Run Code Online (Sandbox Code Playgroud)
用作:
val comp = new Composite
comp += child1
comp += child2
comp -= child1
val firstChild = comp(0)
Run Code Online (Sandbox Code Playgroud)
如果你想得出一个合乎逻辑的结论,我建议将整个复合结构构建为不可变的有向无环图(尽管我知道这通常是不可能的):
case class Composite(children: Component*) extends Component {
def operation() = children foreach { _.operation() }
}
val comp = Composite(child1, Composite(child2, child3), child4)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1953 次 |
| 最近记录: |