liguofeng29’s blog

個人勉強用ブログだっす。

デザインパターン - 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円ですよ、鈴木さん~