【デザインパターン】Visitorパターンをクラス図で理解する

デザインパターン

Visitorパターン

Visitorパターンは、あるオブジェクトの処理を構造から分離するデザインパターンです。
自分なりにVisitorパターンをクラス図にまとめてみました。

Visitorパターンのクラス図

Visitorパターンのクラス図

Visitorパターンのクラス図

Visitorパターンのクラス図の解説

Acceptor側(Acceptorを継承するAcceptor1,2)でメソッドを作成する場合に、そのメソッドをAcceptor1,2クラス内に実装するのではなく、Visitor1,Visitor2クラスに実装し、Acceptor1,2ではそのVisitor1,2オブジェクトを引数にもつacceptメソッドを用意し、そのメソッド内でVisitorオブジェクトのvisitメソッドを呼び出すようにする。visitメソッドではAcceptorを引数に取るので、その属性を参照して処理を行うことができる。

このような構成にすることで、オブジェクト(Acceptor)とその処理(Visitor)を別クラスに分離できる。すると、メソッドを追加したいような場合にはVisitorを実装するクラスを追加すればよくなり、Acceptor側は変更する必要がなくなる。

Visitorパターンをどういう場合に使うか

メソッドに追加変更が発生することが想定されるような場合に、Visitorパターンにしておくことにより、Visitor側の変更だけでよくなり、保守性が高まることが想定される。

PlantUMLでVisitorパターンのクラス図を記述する

Visitorパターンのクラス図をPlantUMLで書いたときのソースです。

@startuml Visitor
interface Visitor{
  + visit(Element) : void
}
class Visitor1 implements Visitor{
  + visit(Acceptor) : void
}
class Visitor2 implements Visitor{
  + visit(Acceptor) : void
}
abstract class Acceptor{
  + accept(Visitor)
}
class Acceptor1 extends Acceptor{
  + accept(Visitor) //引数Visitorのvisitメソッドを実行する
}
class Acceptor2 extends Acceptor{
  + accept(Visitor) //引数Visitorのvisitメソッドを実行する
}
Acceptor .r.> Visitor
@enduml

参考サイトURL

13.Visitor パターン | TECHSCORE(テックスコア)
Visitor パターン – Wikipedia
PHPによるデザインパターン入門 – Visitor〜要素と要素に対する操作を分離する – Do You PHP はてブロ