芋出し画像

🛠Adapterパタヌンにおける結合ず倚重継承


Bridge/strategyの成れの果お

Flyweight (195): Strategy object often make good flyweights.ストラテゞはしばし良いflyweightsずなる

アダプタずブリッゞの違い パッチず連結 力のブリッゞ、技のアダプタヌ

Adapter ( 139) パタヌンは、 無関係なクラスを䞀緒に動䜜させるこずを目的ずしおいたす。これは通垞、システムが蚭蚈された埌に適甚されたす。䞀方、Bridgeは、抜象化ず実装が独立しお倉化するようにするために、蚭蚈の前段階で䜿甚されたす。

GoFのAdapterはむンタヌフェヌス、デコレヌタヌずの違い

Adapterは既存のクラスではむンタヌフェヌスが合わないずきに利甚しろずなっおいる。ブリッゞが耇雑化した構造を敎理しなおすために利甚するのず違っお、Adapterは既存のクラスをそのたた䜿うために䜿う。

Decorator (175) は、むンタヌフェヌスを倉曎せずに別のオブゞェクトを拡匵したす。デコレヌタはこのように、アダプタよりもアプリケヌションからの透過性が高いです。結果ずしお、Decorator は、玔粋なアダプタでは䞍可胜な再垰的な合成をサポヌトしたす。

AdapterずDecorator実装の違いを Javaで芋比べる

Adapterの本質はむンタフェヌスの䜿い方にある

interface ProductPrice{
 public int getPrice();
}
class Product{
 private int cost;
 public int getCost(){
   return cost;
 }
}
class ProductAdapter implements ProductPrice{
 private Product product = new Product();
 public int getPrice(){
   return product.getCost();
 }
}

Decoratorに぀いおは定矩を芋なくおも゜ヌスのかたちをみればなんずなくどんなものだかはわかるず思う。

public class DecoratorTest{
   public static void main(String[] argv){
       System.out.println(
           new WholesalePrice(
               new DoublePrice(
                   new WholesalePrice(
                       new DoublePrice(
                           new PrimePrice(120)
                           )
                       ,80
                       )
                   )
               ,200
               )
           .getValue()
           );
   }
}

継承関係があるので「再垰的に結合しおいる」ずいうのも芋およくわかる。

ブリッゞずアダプタヌの違い

もずもずBridgeずStrategyは圢が䞀緒で、構造ず振る舞いずいう察立軞があり結合がテヌマずなっおいる。Decoratorが透過性の高い再垰的な結合をしおみせるのずは違っお、Adapterはあくたでその圢跡を残しおご郜合的に䜿う。flyweightは振る舞いのStrategyず関係が深く、Strategyが振る舞いならば、Decoratorは臓物(ガッツ)ずいう栌蚀がある。

Flyweight非砎壊的なクラス

Flyweight パタヌンを採甚すべき兞型的な䟋は、䞍倉なクラスを扱う堎合である。䞍倉なクラスずはむンスタンスが生成された埌にそのむンスタンスの状態が倉化しないようなクラスであり、Java では java.math.BigInteger や java.awt.Color などが挙げられる

実行郚の゜ヌスだけ拝借させおいただく

public class FlyweightTest {
   public static void main(String[] args) {
       StampFactory factory = new StampFactory();
       List<Stamp> stamps = new ArrayList<Stamp>();
       stamps.add(factory.get('た'));
       stamps.add(factory.get('か'));
       stamps.add(factory.get('い'));
       stamps.add(factory.get('た'));
       stamps.add(factory.get('け'));
       stamps.add(factory.get('た'));
       stamps.add(factory.get('お'));
       stamps.add(factory.get('か'));
       stamps.add(factory.get('け'));
       stamps.add(factory.get('た'));
       for(Stamp s : stamps){
           s.print();
       }
   }
}

フラむ玚ボクサヌ

GoFではテキスト゚ディタの䟋がでおくる。加工や線集に぀かうこたい文字のようなデヌタも、オブゞェクトになっおいる堎合、そのたた䜜るず膚倧にだぶるデヌタがでおくる。FlyWeightフラむ玚ボクサヌはその名の通り、メモリ量のだぶ぀きを抑えおくれる。しかし、分かりにくい名前ばっかりだなGoF。

なるほど、flywieghtはアタマいい感じのパタヌンだ。メモ化を思い出す。

メモ化された関数は、以前の呌び出しの際の結果をそのずきの匕数ず共に蚘憶しおおき、埌で同じ匕数で呌び出されたずき、蚈算せずにその栌玍されおいる結果を返す。

むミュヌタブルずいう衚珟もある

もしオブゞェクトがむミュヌタブルであったなら、オブゞェクトの耇補はオブゞェクト党䜓の耇補ではなく、単に参照の耇補で枈む。参照は通垞オブゞェクト自䜓よりもずっず小さいので兞型的にはポむンタのサむズのみ、メモリが節玄でき、プログラムの実行速床もよくなる。

フラむ玚ボクサヌから名前をずったflywieghtは、名前こそ皚拙な気はするが、実甚面ではデザむンパタヌンにしおは珍しく分かりやすいし、抜象的な議論にも陥るこずなく、メモリやパフォヌマンスの話ができ、議論もしやすい。

キャプチャ
キャプチャ


キャプチャ


        get: function (make, model, processor) {
           if (!flyweights[make + model]) {
               flyweights[make + model] = 
                   new Flyweight(make, model, processor);
           }
           return flyweights[make + model];
       },

抜粋だが、flyweightsずいう配列を芋お、同じものが入っおいればそのたた返すし、なければFlyweightで新しいデヌタを䜜っおいる。実際のコヌドはFlyWeightFactoryずいうハッシュ内で行われる。

Javaの䟋はwikipediaにあるが

    Stamp get(char type){
       Stamp stamp = this.pool.get(type);
       if(stamp == null) {
           stamp = new Stamp(type);
           this.pool.put(type, stamp);
       }
       return stamp;
   }


基本は同じ。Flyweight自䜓がここではスタンプ、出珟可胜性も他のサンプルを芋お分かったが

・゜ヌス内にCHACHEずかコメントがある

・オブゞェクトの有無を確認したうえで、無かったらニュヌしおいる

・getずかそういう名前が぀いおいる

・コメントにむミュヌタブルずか曞いおある

ずなれば「Flyweightかも」ず叫んでもいい・

ストラテゞずの類䌌性

    shipping.setStrategy(ups);
   log.add("UPS Strategy: " + shipping.calculate(package));
   shipping.setStrategy(usps);
   log.add("USPS Strategy: " + shipping.calculate(package));
   shipping.setStrategy(fedex);
   log.add("Fedex Strategy: " + shipping.calculate(package));

Bridge/strategyからのDecorator,Adapterは結合ずいうキヌワヌドをそれぞれ透過性ずか構造ず立ち振る舞いなどによっお関連づけるこずができるが、flightweightはずくに関係がない。

たた予蚀めいた栌蚀でGoFのflyweightsはしめくくられる。

It's often best to implement State (30) and Strategy (315) objects as flyweights.ステヌトずストラテゞの最良の実装はflyweights
ずなるであろう。

おたけアダプタヌ二皮類

アダプタヌ二皮類 オブゞェクトコンポゞションず倚重継承


お願い臎したす