Javaクラシック23種類の設計モードの構造型モード(一)


構造型モードには、アダプタモード、ブリッジモード、コンビネーションモード、装飾モード、外観モード、メタモード、エージェントモードの7種類があります.
アダプタモードとブリッジモードについて説明します.
一、アダプターモード(Adapter)
アダプターモードは実は簡単で、携帯電話の充電器のように、携帯電話は5 Vが必要で、コンセントは220 Vです.そのため充電器が必要で変圧すればOKです.例えば、中国語が話せる人と英語しか話せない人がコミュニケーションが取れない人は、途中で通訳をお願いします.すべての交流は翻訳を通じて、英語が話せるように翻訳すれば、単一の交流を完成することができます.リンク1の例は非常に生き生きとしている.まとめてみると、共通のインタフェース(Targetと呼ばれる)があるにすぎず、すべてがうまくいけばみんな無事で、似合う必要はありません.あるインタフェースが共通の標準インタフェースでない場合、Targetを実装するときに、非標準インタフェースの変数を再newし、Targetが提供する関数を利用して、関数体の中で非標準インタフェースのオブジェクトの関数を呼び出して、アダプタのようにします.以下に詳細な説明を添付します.
1、Target
public interface Target {    void adapteeMethod();    void adapterMethod();}
2、Adaptee public class Adaptee {    public void adapteeMethod() {        Syste*.out.p*intln("Adaptee method!");    }}
これが上記の非標準インタフェースのクラスです.
3、Adapter
public clas* Adapter implement* Target {    private Adap*ee adaptee;    public Adapter(Adaptee adaptee) {        this.adapte* = adaptee;    } public void adapteeMethod() { adaptee.adapteeMethod(); } public void adapterMethod() { *ystem.out.println("Adapter method!");}}アダプタにAdaptee変数が表示され、汎用標準インタフェースTargetの関数でadaptee.***が呼び出されます.
テストコード:
public class Test {    public static void main(String[] args) {        Target target = new Adapter(new Adaptee());        target.adapteeMethod();        target.adapterMethod();    }}
適用:
    1.すでに存在するクラスを*にしたいのですが、そのインタフェースはあなたのニーズに合っていません.    2.他の非関連クラスや予見不可能なクラス(つまり、インタフェースが必ずしも互換性がないクラス)と協働して動作する多重化可能なクラスを作成したいと考えています.    3.(オブジェクトAdapterのみ)既存のサブクラスを使用したいのですが、インタフェースを一致させるために各サブクラス化することはできません.オブジェクトアダプタは、親インタフェースに適しています.
二、ブリッジモード(Bridge)
ブリッジ・モードは、抽象部分と実装部分を分離するために使用され、1つのトランザクションに複数の次元が決定されている場合は、ブリッジ・モードを使用してデカップリングする必要があります.例えば、道には一般的な道路と高速道路の2種類があります.車は乗用車と大型トラックの2種類があります.このような2つの組み合わせには4つの状況があり、どの車がどの道にあるかを説明するために4つのクラスを設計する必要がある.ブリッジモードを使用すると簡単ですが、ブリッジモードの真髄は、1つのクラスで別のクラスのオブジェクトを維持することです.例えば、私が「道」を定義したとき、変数Car(これはベースクラスで、そのサブクラスは乗用車とトラック)を設計しました.このように「道」という虚類を受け継ぐことで、一般道路と高速道路の2つの具体的な道が得られる.虚類Carを継承し、小型車と大型トラックの2つの具体的な車を得た.このように物事を記述する際、私はCar c=new高速道路を通って、cの中のCarという変数を乗用車と大型トラックに割り当てることで、物事を明確に記述することができます.
もっと複雑であれば、上の例は2つの次元しかありません:道と自動車、もう1つの次元:人.もちろん人には男、女がいます.では、論理的な観念と現実が一致するために、虚類人を再定義する際に、メンバー変数Carを定義することができます.ダミークラスCarを定義するときに、メンバー変数Wayを追加します.このように物事を仮定してA、B、C、D..いくつかの次元は、A定義時にダミークラスBのメンバー変数を1つ追加するだけです.Bを定義するときにCのメンバー変数を1つ追加するなど、ブリッジモードです.リンクの例を見るとC++で書かれていますが、時間があればjavaで書きます.次に、男性と女性が馬のクリップとズボンをはいている例を添付します.典型的な2つの次元です.
1.Abstraction抽象クラスpeopleは、Implementorタイプオブジェクトへのポインタを維持します.ここでは、後ろの服の虚クラスを指します.
public abstract class Person {    private Clothing clothing;    pr*vate String type;    public Clothing getClothing() {        return clothing;    }    publi* void setClothing() {        this.clothing = *lothingFactory.getClothing();    }    public void setType(String type) {        t*is.type = type;    }    public String getType() {        return this.ty*e;    }    public abstract void dress();}
2、RefinedAbstraction:Abstractionによって定義されたインタフェースを拡張する.
男のpublic class Man extends*erson{public Man(){settype("男");    }    public void dress() {        Clothing clothing = get*lothing();        clothing.personDressCloth(this);    }}
女性:
public class Lady extends Person{public Lady(){settyp*(「女」);    }        public void dress() {        Cloth*ng clothing = getClothing();        c*othing.personDressCloth(this);    }}
3、Implementorは、Ab*tractionのインタフェースと完全に一致する必要はない実装クラスのインタフェースを定義する.実際には、この2つのインタフェースは完全に異なることができます.一般的に、Implementorインタフェースは基本操作のみを提供し、Abstractionはこれらの基本操作に基づくより高いレベルの操作を定義します.
public abstract class Clothing {    public abstract void personDressC*oth(*erson person);}
4、具体的なConcreteImplemento*public class Jackt extends Clothing{public void personDressCloth(Person person){System.out.println(person.gettype()+"ベストを着る");}}public class Trouser extends Clothing{public void personDressCloth(Person person){System.ou*.println(*erson.gettype()+"ズボンをはく");    }}
テストコード:
public class Test { public static void main(String[] args) { Person man = new Man(); Person lady = new Lady(); Clothing jacket = new Jacket(); Clothing trouser = new Trouser(); jacket.personDressCloth(man); trouser.personDressCloth(man); jacket.personDressCloth(lady); trouser.personDressCloth(lady); } } 

ははは、後で探してみましたが、http://blog.csdn.net/jason0539/article/details/22568865すでに上の人、道、車の例をJavaで書いてありますので、参考にしてみてください.しかし、文の中で、人の中に道があり、道に車があるという構造思想はあまりお勧めではありません.また、インターフェースを使っていないと少し乱れていて、はっきりしません.
また、この人、車、道の例は構築上一方向で、これがいいです.newは一人で出てきて、どんな道をセットしますか.服を着る例は双方向結合で、ClothingではPeople虚類を伝える必要があります.幸いにも結合しているのは虚類です.実際には,一方向結合と見なすこともでき,Peppleではdressメソッドを定義し,前述した作成型モードで必要なClothingタイプを得ることでokとなる.