KICK THE DP

KICK THE CAN CREWでデザインパターンを攻略するブログ

Ch.17 KICK THE OBSERVER

【目標】

Observerパターンを使って、メンバーの活動休止とグループの活動休止をリンクさせよう

【クラス図】

f:id:mikeera2:20160927004209p:plain

【実装】

<IGroupインターフェース:Observer>

f:id:mikeera2:20160927011228p:plain

<IMemberインターフェース>

f:id:mikeera2:20160927011358p:plain

≪Memberクラス:ConcreteSubject≫

f:id:mikeera2:20160927012022p:plain

f:id:mikeera2:20160927012025p:plain

≪Groupクラス:ConcreteObserver≫

f:id:mikeera2:20160927011701p:plain

f:id:mikeera2:20160927011710p:plain

[Mainクラス]

f:id:mikeera2:20160927012156p:plain

【出力結果】

f:id:mikeera2:20160927012254p:plain

【メモ】

・Observerって名前が悪すぎると思う。状態を伝えられるばっかりのReceiverじゃねぇか。

・KICKを絡ませたネタとしては割ときれいにまとまった気がする

 

 

Ch.16 KICK THE MEDIATOR

【目標】

Mediatorパターンを使ってTORIIIIIICO!のマイクパスをやってみよう

【クラス図】

f:id:mikeera2:20160926184914p:plain

【実装】

<IMicrophonePassインターフェース:Mediator>

f:id:mikeera2:20160926223650p:plain

<MC抽象クラス:Colleague>

f:id:mikeera2:20160926223935p:plain

Krevaクラス:ConcreteColleague≫

f:id:mikeera2:20160926224409p:plain

f:id:mikeera2:20160926224510p:plain

Mcuクラス:ConcreteColleague≫

~略~

≪Littleクラス:ConcreteColleague≫

~略~

Cuezeroクラス:ConcreteColleague≫

~略~

≪Channelクラス:ConcreteColleague≫

~略~

≪Sohjinクラス:ConcreteColleague≫

~略~

≪Hookクラス:ConcreteColleague≫

f:id:mikeera2:20160926225026p:plain

f:id:mikeera2:20160926225032p:plain

≪Toriiiiiicoクラス:ConcreteMediator≫

f:id:mikeera2:20160926225427p:plain

[Mainクラス]

f:id:mikeera2:20160926230650p:plain

【出力結果】

f:id:mikeera2:20160926230203p:plain

f:id:mikeera2:20160926230214p:plain

f:id:mikeera2:20160926230222p:plain

【メモ】

・1番だけにしとかないとJ/A/S/R/A/Cに怒られそう

・イメージしやすいけど、厳密には正しい例ではない。まぁ今までのに比べればよろしい。

・Facadeパターンとの違いは命令主が外部か内部かという違いだと認識しているけど、間違ってるかもしれない。

Ch.15 KICK THE FACADE

【目標】

Facadeパターンを使ってワーナーミュージックさんにKICK THE CAN CREWの新曲を作ってくれるようお願いしよう

【クラス図】

f:id:mikeera2:20160925180305p:plain

【実装】

≪WarnerMusicクラス:Facade≫

f:id:mikeera2:20160925181638p:plain

Krevaクラス:Class≫

f:id:mikeera2:20160925181056p:plain

Mcuクラス:Class≫

f:id:mikeera2:20160925181204p:plain

≪Littleクラス:Class≫

f:id:mikeera2:20160925181308p:plain

≪Kumaiクラス:Class≫

f:id:mikeera2:20160925181439p:plain

[Mainクラス:Client]

f:id:mikeera2:20160925181543p:plain

【出力結果】

f:id:mikeera2:20160925181744p:plain

【メモ】

・割と無意識にやってることのような気はするけど、まだまだ徹底できそうなパターン

・ワーナーさんよろしくお願いします。

Ch.14 KICK THE CHAIN OF RESPONSIBILITY

【目標】

Chain of Responsibilityクラスを使ってメンバーにソロ仕事を割り振ろう

【クラス図】

f:id:mikeera2:20160925165338p:plain

【実装】

<AbstractMember抽象クラス:Handler>

f:id:mikeera2:20160925171014p:plain

f:id:mikeera2:20160925173558p:plain

≪Memberクラス:ConcreteHandler≫

f:id:mikeera2:20160925173352p:plain

[Mainクラス:Client]

f:id:mikeera2:20160925173930p:plain

【出力結果】

f:id:mikeera2:20160925174016p:plain

【メモ】

・little.JudgeOffer()だけ見ると、何をやっているのかしごくわかりにくい。先頭にダミーメンバーを置いてもいいか

MCUに失礼。歌えるし。

Ch.13 KICK THE VISITOR

【目標】

Ch.11でやった「KICK THE CAN CREWをHTMLでリスト表示しよう」をVisitorパターンで書き換えてみよう

【クラス図】

f:id:mikeera2:20160924190021p:plain

【実装】

<AbstractHtmlVisitor抽象クラス:Visitor>

f:id:mikeera2:20160924220650p:plain

<HtmlFactor抽象クラス:Element>

f:id:mikeera2:20160924221128p:plain

≪TextValueクラス:ConcreteElement≫

f:id:mikeera2:20160924224833p:plain

 ≪Tagクラス:ConcreteElement≫

f:id:mikeera2:20160924225105p:plain

f:id:mikeera2:20160924225216p:plain

≪HtmlVisitorクラス:ConcreteVisitor≫

f:id:mikeera2:20160924225449p:plain

f:id:mikeera2:20160924225458p:plain

[Mainクラス:ObjectStructure]

f:id:mikeera2:20160924225607p:plain

【出力結果】

f:id:mikeera2:20160924225711p:plain

【メモ】

Main→<body>「Visitor受け入れろ」

<body>→Visitor「OK、来いよ」

  Visitor「bodyの情報書くで。

      あれ、中に<ul>タグあるやん。」

  Visitor→<ul>「俺を受け入れてよ」

  <ul>→Visitor「OK、来いよ」

    Visitor「<ul>の情報書くで。

        あれ、中に<li>タグあるやん。」

    Visitor→<li>「俺を受け入れてよ」

    <li>→Visitor「OK、来いよ」

      Visitor「<li>の情報書くで。

          あれ、中にKREVAおるやん。」

      Visitor→KREVA「俺を受け入れてよ」

      KREVA→Visitor「OK、来いよ」

        Visitor「KREVAの情報書くで。

            KREVAにもう用はないな」

      Visitor「<li>にもう用はないな」

    Visitor「あれ、まだ<li>タグあるやん」

    Visitor→<li>「俺を受け入れてよ」

    <li>→Visitor「OK、来いよ」

      Visitor「<li>の情報書くで。

          あれ、中にMCUおるやん。」

      Visitor→MCU「俺を受け入れてよ」

      MCU→Visitor「OK、来いよ」

        Visitor「MCUの情報書くで。

            MCUにもう用はないな」

      Visitor「<li>にもう用はないな」

    Visitor「あれ、まだ<li>タグあるやん」

    Visitor→<li>「俺を受け入れてよ」

    <li>→Visitor「OK、来いよ」

      Visitor「<li>の情報書くで。

          あれ、中にLITTLEおるやん。」

      Visitor→LITTLE「俺を受け入れてよ」

      LITTLE→Visitor「OK、来いよ」

        Visitor「LITTLEの情報書くで。

            LITTLEにもう用はないな」

      Visitor「<li>にもう用はないな」

    Visitor「<ul>にもう用はないな」

  Visitor「<body>にもう用はないな」

 

いや、わからんわ。

 

・具体的な処理(WriteLine)をVisitorクラスにすべて書いているところがポイントらしい

Ch.12 KICK THE DECORATOR

【目標】

DECORATORパターンを使って、MCUが作曲や俳優の仕事ができるようにしよう。

【クラス図】

f:id:mikeera2:20160924170408p:plain

【実装】

<McuComponent抽象クラス:Component>

f:id:mikeera2:20160924180100p:plain

Mcuクラス:ConcreteComponent≫

f:id:mikeera2:20160924180307p:plain

<Ability抽象クラス:Decorator>

f:id:mikeera2:20160924180535p:plain

≪Composableクラス:ConcreteDecorator≫

f:id:mikeera2:20160924181140p:plain

≪Actableクラス:ConcreteDecorator≫

f:id:mikeera2:20160924181358p:plain

[Mainクラス]

f:id:mikeera2:20160924181742p:plain

【出力結果】

f:id:mikeera2:20160924181829p:plain

【メモ】

MCUに失礼

・Component(本体)側とDecorator側を同じクラスから派生させるのに違和感がある

・実際にメソッドが呼び出される順番を意識する必要がありそう

・それぞれのDecoratorが独立でないと具合が悪そうで、具体的にどういう場面で使えるのかイマイチつかみきれてない

MCUに失礼

Ch.11 KICK THE COMPOSITE

【目標】

KICK THE CAN CREWをHTMLでリスト表示しよう

【クラス図】

f:id:mikeera2:20160924155648p:plain

【実装】

<HtmlFactor抽象クラス:Component>

f:id:mikeera2:20160924160212p:plain

≪TextValueクラス:Leaf

f:id:mikeera2:20160924160656p:plain

≪Tagクラス:Composite≫

f:id:mikeera2:20160924161212p:plain

f:id:mikeera2:20160924161218p:plain

[Mainクラス:Client]

f:id:mikeera2:20160924161511p:plain

【出力結果】

f:id:mikeera2:20160924161558p:plain

【メモ】

・お題としては悪くないがもはやKICK関係ない