Facadeパターンでの開発

開発の初案件が終わったので、何回かに分けてアウトプットします。
今回はFacadeパターンでの実装の流れについてです。
以下のような前提で開発をしました。
ファイル名やクラス名は実際のものと変えています。

## Facadeパターン
複数のクラスが集まってできたプログラムは、様々なクラスのメソッドを呼ぶので処理が複雑になります。
このような場合に処理を依頼する側から見た際に窓口となるファイルを用意するのがFacadeパターン。
Facadeに当たるファイルには実際の処理は書かず、メソッドの呼び出しをメインにします。
今回は携帯電話の支払い履歴を閲覧するような処理を実装しました。
処理としては電話番号とIDで顧客情報照会をした後、顧客情報に紐づく履歴情報を取得するという流れです。
中身の処理は今回は省略します。
WB0_01が窓口となるFacadeにあたり、顧客情報照会をするクラスがClient、履歴情報を取得するクラスがPaymentHistoryとします。![スクリーンショット 2022-09-17 17.35.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551832/2ca87e74-dea1-2060-000f-c503485979c4.png)



## インターフェース
基本的にメソッドはインターフェースにしています。
インターフェースを定義するファイルと実際の中身の処理が書かれているファイルを用意しています。
|定義ファイル|処理記述ファイル|
|:--|:--:|
|Client.java|ClientImpl.java|
|PaymentHistory.java|PaymentHistoryImpl.java|


## Bean定義ファイル
インスタンスをxmlファイルに登録します。
他クラスのメソッドを使用する時は、ここで登録されているインスタンスを使用してメソッドを呼び出します。
Bean定義については[こちら](https://qiita.com/kent2980/items/c3a477f4811d85e7d1fd)を参考にしました

```bean-conf.xml
<bean id=WB0_01 class="com.Wb0controller.WB0_01">
    <property name="client"><ref bean="Client"></property>
    <property name="paymentHistory"><ref bean="PaymentHistory"></property>
</bean>
```
各フィールドへの値の挿入、フィールドの取得は処理を呼び出すファイルにsetter/getterメソッドを作成

```WB0_01.java
public class WB0_01 {
    private Client client = null;
    private PaymentHistory paymentHistory = null;

    public setClient(Client client) {
        this.client = client;
    }

    public getClient() {
        return client;
    }

    public setPaymentHistory(PaymentHistory paymentHistory) {
        this.paymentHistory = paymentHistory;
    }

    public getPaymentHistorye() {
        return paymentHistory;
    }
}

```

## 処理の流れ

#### 1. ユーザーの情報を取得
ユーザーが支払い履歴を閲覧しようと電話番号を入力して閲覧ボタンを押すと、MainクラスでWB0_01.javaのdoReferメソッドを呼び出す。
この時に上記で説明した各フィールドのsetterメソッドが動き値が入る。
そしてHttpServletRequestインターフェースで定義されているgetHeaderメソッドを呼び出すことによって、リクエストに含まれているユーザーの電話番号やIDを取得できる

```WB0_01.java


public class WB0_01 {

    private Client client = null;
    private PaymentHistory paymentHistory = null;

    public setClient(Client client) {
        this.client = client;
    }

    public getClient() {
        return client;
    }

    public setPaymentHistory(PaymentHistory paymentHistory) {
        this.paymentHistory = paymentHistory;
    }

    public getPaymentHistorye() {
        return paymentHistory;
    }

    public int doRefer() {

        try {
            String number = this.getReq().getHeader("user-number");
            String id = this.getReq().getHeader("user-id");
        }catch(省略){
            //エラーを返す処理
        }
    }
}
```

#### 2. 電話番号とIDを基に顧客情報照会を行う
上記で書いたとおり、メソッドはインターフェースを使用していて、定義ファイルと処理ファイルの2ファイルに分かれている

Clientクラスのインターフェースの定義ファイル
```Client.java

public interface Client {
    String getClientInfo(String number, String id);
}
```

Clientクラスのインターフェースの処理ファイル
```ClientImpl.java
public class ClientImpl implements Client {
    @Override
    public String getClientInfo(String number, String id) {
        //顧客情報を取得する処理
        //numberとidを基にSqlを実行したりなど
    }
}
```

**呼び出し側**
他クラスのメソッドを使用することになるので、bean-conf.xmlで定義をしたインスタンスを使ってメソッドを呼び出す。
Clientクラスのメソッドを呼び出すので、Clientクラスのインスタンスを使用する。
1.でsetterメソッドが動いているので、clientフィールドには値が入っている。
なので**getterメソッド+メソッド名**でClientクラスのメソッドを呼び出せる。

```WB0_01.java

public class WB0_01 {
    private Client client = null;
    private PaymentHistory paymentHistory = null;
    //ここが動いたのでclientには値が入っている
    public setClient(Client client) {
        this.client = client;
    }
    //getClientを呼び出すことでclientを使用することができる
    public getClient() {
        return client;
    }

    public setPaymentHistory(PaymentHistory paymentHistory) {
        this.paymentHistory = paymentHistory;
    }

    public getPaymentHistorye() {
        return paymentHistory;
    }

    public int doRefer() {
        try {
            String number = this.getReq().getHeader("user-number");
            String id = this.getReq().getHeader("user-id");
            //顧客情報照会
            String customer = this.getClient.getClientInfo(String number, String id);
        }catch(省略){
            //エラーを返す処理
        }
    }
}
```

#### ３.顧客情報を基に履歴情報を取得
処理の流れとしては顧客情報と変わりはありません

PaymentHistoryクラスのインターフェースの定義ファイル

```PaymentHistory.java

public interface PaymentHistory {
    String getPaymentInfo(String customer);
}
```

PaymentHistoryクラスのインターフェースの処理ファイル
```PaymentHistoryImpl.java
public class PaymentHistoryImpl implements PaymentHistory {
    @Override
    public String getPaymentInfo(String customer) {
        //履歴情報を取得する処理
        //顧客照会で取得した情報を基にSqlを実行したりなど
    }
}
```

**呼び出し側**
ここもClientと同じで**getterメソッド+メソッド名**でPaymentHistoryクラスのメソッドを呼び出して処理をします

```WB0_01.java
public class WB0_01 {
    private Client client = null;
    private PaymentHistory paymentHistory = null;

    public setClient(Client client) {
        this.client = client;
    }

    public getClient() {
        return client;
    }
    //ここが動いたのでpaymentHistoryには値が入っている
    public setPaymentHistory(PaymentHistory paymentHistory) {
        this.paymentHistory = paymentHistory;
    }
    //getPaymentHistoryeを呼び出すことでpaymentHistoryを使用することができる
    public getPaymentHistory() {
        return paymentHistory;
    }

    public int doRefer() {
        try {
            String history = this.getReq.getHeader("user-number");
            String id = this.getReq.getHeader("user-id");
            //顧客情報照会
            String customer = this.getClient.getClientInfo(String number, String id);
            //支払い情報取得
            String history = this.getPaymentHistorye.getPaymentInfo(String customer);
        }catch(省略){
            //エラーを返す処理
        }
    }
}
```

後は少し省略しますがcustomerとhistoryを返して支払い情報取得処理は終わりという流れになります
```WB0_01.java
return this.createResponse(ReturnCde.OK_0,null,customer,history);
```
今回はFacadeパターンでの処理の流れを書きました。
中身の処理については何回かに分けて、また書いてみたいと思います！