私たちは、様々なデザインパターンの巧妙さをウィットに富んだ形で説明し、デザインパターンの始まりから落とし穴まで、あなたをお連れします! 碁
アピアランス・パターンのコーディング
王監督:授業中です!林蕾東と郝梅はもう着きましたか?
小林👨:監督、これです。
Mei :ここにいますよ、マネージャー。
王总经理:さて、授業に来て、今日は構造設計パターンの一種、つまり、外観パターンを話すために、外観パターンは、ファサードパターンとも呼ばれ、文字通り、サブシステムが呼び出される可能性が高くなるように、高レベルのインターフェイスを介して、サブシステム内のインターフェイスのグループにアクセスするために使用される、外の世界に統一されたインターフェイスを提供することです!
暁明:ああ、マネージャーはあなたが言いたいのはそうではありません、外観モードは、サブシステムの種類に適用されますますます複雑になっている、あなたは、呼び出しがよりシンプルになるように外観モードを増やすことができますが、また、システムの依存性を減らすことができます疎結合
王監督:はい、小米はよく理解しています。
小林は頭を触りました: マネージャー、まだよくわからないんです。
マネージャー王:林ステップ移動、私はあなたが理解していない知っている、次に、コーディングに深い理解。
- あなたのアイデアとコーディングを上司に公開してください!
アピアランス・パターン
王社長:仮に、ポイント交換ギフトシステムを維持する必要があるとします。
メインデザインパターンのため、ビジネスプロセスを簡素化し、ユーザーがアイテムを交換したいことを想定して、アイテムオブジェクトが存在する必要があります、あなたはこれらの手順を実行する必要があります、ポイントをチェックし、インベントリ -> 支払いポイント -> 配送注文番号
- さて、あなたのアイデアはまだオープンですか?さあ、コーディング。
このオブジェクトにget/set/toString/constructなどのメソッドを追加するには、Alt + Insertを忘れないでください。
public class Gift {
private String name;
public Gift(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Gift{" +
"name='" + name + '\'' +
'}';
}
}
では、 ポイントや在庫を検証するサービスを設計するのはどうでしょう? 簡単のために、Giftを直接渡して、検証を通過したことを直接出力して、trueを返します。
public class CheckService {
public Boolean isAvaliable(Gift gift) {
System.out.println("をチェックしよう。 + gift.getName() + "ポイント、棚卸し合格");
return true;
}
}
次に、ポイントサービスの支払いも手元にない、直接ギフトにし、直接支払いの成功を出力し、trueを返します。
public class PayService {
public Boolean pay(Gift gift) {
System.out.println("有料" + gift.getName() + "成功」);
return true;
}
}
OK]をチェックし、支払いを介して、それを出荷、古い方法、パスギフト、あなたが好きな単一の番号を生成し、単一の番号を返すことを忘れないで戻ってきます!
public class ShippingService {
public String shipGift(Gift gift) {
System.out.println(""運搬" + gift.getName());
String shippingOrderNo = "666";
return shippingOrderNo;
}
}
サブシステムが多すぎてうんざりしませんか?そこで、これらのサブシステムを呼び出すための統一されたGiftServiceを作成するために、appearanceパターンが役に立ちます。
public class GiftService {
/**
* Spring環境が注入されていないので、ここに直接コンストラクタのメソッドがある。
*/
private final PayService pointsPaymentService = new PayService();
private final CheckService checkService = new CheckService();
private final ShippingService shippingService = new ShippingService();
public void giftExchange(Gift gift) {
// チェックサム、インベントリ
if (checkService.isAvaliable(gift)) {
// 支払いクレジット
if (pointsPaymentService.pay(gift)) {
// シングルナンバーを取得する
String orderNo = shippingService.shipGift(gift);
System.out.println("ロジスティクスが送られた。 + orderNo);
}
}
}
}
すべてが完璧なので、それをテストするためにTestクラスを書きましょう。
public class Test {
public static void main(String[] args) {
// ギフトオブジェクトを生成する
Gift gift = new Gift(" iphone999 ");
// Spring環境を使わず、直接 newGiftServiceを使う. Spring環境であれば、GiftServiceを直接インジェクトして呼び出すことができる。
GiftService giftService = new GiftService();
// 統一されたインターフェースを呼び出す
giftService.giftExchange(gift);
}
}
走る?
その結果、このiphone999の発行に成功しました。
アピアランス・パターンのまとめ
マネージャー王:次に、みんなのアイデアダブルクリックシフトの使用の枠組みの中で外観のパターンを見て、org.springframework.jdbc.supportパッケージにあるjdbcUtilsクラスを検索します。
JdbcUtils クラスの etc. メソッドは、サブクラスを呼び出すために外観クラスによって提供されるインタフェースです。
リンボー、アイデアがなかったのはあなただけですよ。 さあ、大きなスクリーンを見てください。
public static void closeConnection(@Nullable Connection con) {
if (con != null) {
try {
con.close();
} catch (SQLException ex) {
logger.debug("Could not close JDBC Connection", ex);
} catch (Throwable ex) {
// We don't trust the JDBC driver: It might throw RuntimeException or Error.
logger.debug("Unexpected exception on closing JDBC Connection", ex);
}
}
}
例として、メソッドを取ると、メソッドのエントリConnectionクラスは、クラスの外観のパッケージを介してjava.sqlパッケージに配置され、クライアントが直接対応する操作インターフェイスを実行するクラスの外観を呼び出すには、直接java.sqlパッケージの下にサブクラスを呼び出す必要はありません。偶然かどうか、素晴らしいかどうか、拍手〜!
外観モード概要
小林👨:マネージャーは、外観のパターンは良い賢いああ、私はサブシステムの深さを理解する必要はありません、多くの呼び出し処理を簡素化し、このような良いデザインパターンは欠点がありますか?
マネージャー:あなたは子供、最終的にポイントに尋ね、その後、良いデザインパターンは欠点があるでしょう、外観パターンの欠点は、サブシステムを増やすことです、サブシステムの動作を拡張するリスクを導入するのは簡単ですが、オープンとクローズの原則に準拠していません。
マネージャー:今日のレッスンは理解できましたか?このレッスンを聞いて、あなたの仕事や勉強の中で、アピアランス・パターンを使って最適化できる部分はありますか?アピアランス・パターンを使って、他のフレームワークが思いつきますか?
このレッスンのコードアドレス:https://.com/isysc1/desgin





