デザインパターン - visitor
【visitorパターンとは】
受け入れ側(データ構造)と訪問者(処理)を分離し、データ構造を変更せず処理を追加・変更できる。
【visitorパターンのクラス図】
【visitorパターンのメリット】
データ構造を変更せず処理を追加・変更できる。
【サンプル】
Acceptable.java |
package visitor;
// 受け入れIF
public interface Acceptable {
public void accept(Visitor v);
}
|
Visitor.java |
package visitor;
// 訪問者IF
public interface Visitor {
public void visit(Home h);
}
|
Home.java |
package visitor;
// 家
public abstract class Home implements Acceptable{
public int denki; // 電気使用量
public int suido; // 水道使用量
public int gas; // ガス使用量
public Home(int denki, int suido, int gas) {
this.denki = denki;
this.suido = suido;
this.gas = gas;
}
// 名前取得
public abstract String getName();
@Override
public void accept(Visitor v) {
v.visit(this);
}
}
|
SuzukiHome.java |
package visitor;
// 鈴木の家
public class SuzukiHome extends Home{
public SuzukiHome(int denki, int suido, int gas) {
super(denki, suido, gas);
}
@Override
public String getName() {
return "鈴木";
}
}
|
SuidoPerson.java |
package visitor;
// 水道会社の人ね
public class SuidoPerson implements Visitor{
// 水道料金
private static int Fee = 3;
@Override
public void visit(Home h) {
System.out.println("水道料金は" + h.suido * Fee + "円ですよ、" + h.getName() + "さん~");
}
}
|
DenkiPerson.java |
package visitor;
// 電気会社の人ね
public class DenkiPerson implements Visitor{
// 電気料金
private static int Fee = 10;
@Override
public void visit(Home h) {
System.out.println("電気料金は" + h.suido * Fee + "円ですよ、" + h.getName() + "さん~");
}
}
|
VisitorTest.java |
package visitor;
public class VisitorTest {
/**
* @param args
*/
public static void main(String[] args) {
Home home = new SuzukiHome(100, 200, 400);
// 電気会社の人を呼んで電気料金計算
home.accept(new DenkiPerson());
// 水道会社の人を呼んで電気料金計算
home.accept(new SuidoPerson());
// データ構造を変えずに、処理の変更、追加ができる。
// ガス会社の人を呼ぶことで、ガス料金も簡単に計算できる
// データ構造(電気使用量など)を変更せず、処理変更(料金の変更)ができる
}
}
|
実行結果 |
電気料金は2000円ですよ、鈴木さん~
水道料金は600円ですよ、鈴木さん~
|