Scala 中的复合设计模式?

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编写它?特别是我无法理解如何编写接口并实现它?

Kev*_*ght 5

在 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)