インタビューの要点:一般的なデザインパターンの要約

設計モードは、設計プロセスにおけるプログラマーの長年のベストプラクティスの蓄積であり、研究開発の品質とエンジニア間の通信効率を向上させることができます。


Xゲームアクセスプラットフォームでテンプレートメソッドモードを使用しました。シナリオ:開発したゲームを異なるチャネルにプッシュする必要があります。各チャネルのユーザーログインと再充電インターフェイスの実装は異なり、Xゲームプラットフォームはゲームインターフェイスとして使用されます。 。さまざまなチャネルに入るサービスプラットフォームは、ゲームアクセスの一貫性を確保し、さまざまなチャネルの違いを排除する必要があります。
テンプレートメソッドを使用する利点:

  1. ゲームアクセスのプロセスを修正しました:ログイン、再充電アクセス。
  2. プロトコルと実装は分離されています。各チャネルは、対応するドッキングプロトコルの違いに従ってアクセスされ、違いは上位層で消去されます。
  3. スケーラビリティが向上し、新しいチャネルを簡単に追加できます。
  4. ゲームへのアクセスをより柔軟に処理できます。

ログインコードを最適化する過程で、オブザーバーモードを使用しました。たとえば、Springのイベントメカニズムまたはguavaが提供するEventBusを使用できます。

前のログインコードはヌードルスタイルで、1行のコードが対応するロジックを処理します。たとえば、ログインが完了すると、ログが記録され、ポイントが記録されます。ポイントを増やすようにサービスに通知され、ログインを増やすように統計サービスに通知されます。回数(シングルトンモードを使用)、毎日のアクティビティを変更します。

ビューアモードを使用した後、ログイン成功メッセージを送信し、さまざまな論理操作を処理します。リスナーで。コードが簡素化され、保守性とスケーラビリティが向上します。

1つ:シングルトンモード使用シナリオ:Webサイトのカウンターは通常、シングルトンモードで実装されます。そうしないと、同期が困難になります。


簡単に言うと、アプリケーションには特定のクラスのインスタンスオブジェクトが1つしかないため、コンストラクターはprivateで装飾されているため、newに移動できません。通常、インスタンスはgetInstance()メソッドで取得します。getInstance()の戻り値はオブジェクトへの参照であり、新しいインスタンスではないため、複数のオブジェクトと誤解しないでください。シングルトンモードも非常に簡単に実装できます。デモを直接ご覧ください。

パブリッククラスシングルトン{

    プライベート静的シングルトンシングルトン;

    プライベートSingleton(){     }

    public static Singleton getInstance(){         if(singleton == null){             singleton = new Singleton();         }         return singleton;     } }私の習慣によると、完全なコメントを書くのが待ちきれません。わかりませんが、このコードも単純なのでコメントは書きませんでした。この数行のコードがわからない場合は、洗って寝ることができます。起きたら、私のブログを見て、多分あなたはそれを理解することができます。







2:オブザーバーモードに
は、オブジェクト間に1対多の 依存関係があります。オブジェクトの状態が変化すると、それに依存するすべてのオブジェクトに通知され、自動的に更新されます。Androidのさまざまなリスナーがこのデザインパターンを使用しています。ユーザーが電話を操作している限り、対応するリスナーに通知され、プロセスに応答します。 


栗をあげてください。Xiaomei(女性、28歳)、Lao Wang、LaoLiの3人がいるとします。Xiaomeiはとても美しくコケティッシュで、LaoWangとLaoLiは2人の中年男性のディックであり、常に彼女のあらゆる動きに注意を払っています。ある日、シャオメイは言った:私の夫は今日家にいない、一人でいるのはとても退屈です~~~この文はラオ・ワンとラオ・リーによって聞かれ、結果は壊れて、彼女はとても幸せでした。しばらくして、ラオ・ワンシャオメイの家のドアに急いで入ったので、入って来ました........................パ〜パパパパパパ〜 
ここ、シャオメイはオブザーバーであり、LaoWangとLaoLiはオブザーバーです。オブザーバーはメッセージを送信し、オブザーバーは対応する処理を実行します。コードを参照してください。

public interface Person {     //     LaoWangとLaoLiは、このインターフェイスを介してXiaoMeiからメッセージを受信できますvoidgetMessage(String s); }このインターフェイスは、XiaoMeiが通知を送信するときにLaoWangとLaoLiの電話番号に相当します。getMessageを呼び出します。この呼び出し、呼び出しはインターフェイスを呼び出すことです、あなたが理解していないかどうかは関係ありません、最初に見下ろしてください




パブリッククラスLaoWangはPerson {を実装します

    プライベート文字列名= "老王";

    public LaoWang(){     }

    @Override
    public void getMessage(String s){         System.out.println(name + "Xiaomeiから呼び出しを受信しました。呼び出しの内容は次のとおりです:" + s);     }

}

パブリッククラスLaoLiはPerson {を実装します

    プライベート文字列名= "老李";

    public LaoLi(){     }

    @Override
    public void getMessage(String s){         System.out.println(name + "Xiaomeiから呼び出しを受信しました。呼び出しの内容は次のとおりです:->" + s);     }

}

コードは非常に単純です。Xiaomeiのコードを見てみましょう。

public class XiaoMei {     List <Person> list = new ArrayList <Person>();      public XiaoMei(){      }


     public void addPerson(Person person){          list.add(person);      }

     //リストをトラバースして、あなたに
     恋をしているすべての人に通知を送信しますpublic void notifyPerson(){          for(Person person:list){              person.getMessage( "今日は一人で家にいます、ここに来てください。あなたは私を得ることができます! ");          }      } }結果が正しいかどうかを確認するために、テストクラスを書いてみましょう





public class Test {     public static void main(String [] args){

        XiaoMei xiao_mei = new XiaoMei();
        LaoWang lao_wang = new LaoWang();
        LaoLi lao_li = new LaoLi();

        //
        LaoWangLaoLiの両方がXiaomeiに登録されていますxiao_mei.addPerson(lao_wang);
        xiao_mei.addPerson(lao_li);

        // XiaomeiはLaoWangとLaoLiに通知を送信します
        xiao_mei.notifyPerson();
    }
}

実行結果のスクリーンショットを撮りましたが、
 
完璧でした ~~~

3:デコレータモード 
は、既存のビジネスロジックをさらにカプセル化して、機能を追加します。たとえば、JavaのIOストリームはデコレータモードを使用します。ユーザーがデコレータモードを使用すると、自由にアセンブルして、必要な効果を実現できます。 


栗をあげて、サンドイッチを食べたいです。まずは大きなソーセージが必要です。クリームが好きです。ソーセージにクリームを少し入れ、野菜を少し入れて、最後にパンを2枚加えます。とてもボリュームがあります。昼食。、栄養と健康、それではどのようにコードを書くべきですか? 
まず、他のすべての食品がこのクラスを継承するように、Foodクラスを作成する必要があります。コードを見てください。

パブリッククラスフード{

    プライベート文字列food_name;

    public Food(){     }

    public Food(String food_name){         this.food_name = food_name;     }

    public String make(){         return food_name;     }; }コードは非常に単純なので、説明しません。次に、それを継承するためにいくつかのサブクラスを記述します。




// Breadクラス
publicclass Bread extends Food {

    プライベートフードbasic_food;

    public Bread(Food basic_food){         this.basic_food = basic_food;     }

    public String make(){         return basic_food.make()+ "+面包";     } }


// Creamクラス
publicclass Cream extends Food {

    プライベートフードbasic_food;

    public Cream(Food basic_food){         this.basic_food = basic_food;     }

    public String make(){         return basic_food.make()+ "+奶油";     } }


// Vegetable
public class Vegetable extends Food {

    プライベートフードbasic_food;

    public Vegetable(Food basic_food){         this.basic_food = basic_food;     }

    public String make(){         return basic_food.make()+ "+蔬菜";     }

}

これらのクラスは類似している。施工方法は、食品の種類のパラメータを渡し、その後、メイク方法に独自のロジックの一部を追加します。あなたはそれを書くなぜあなたはまだ理解していない場合は、ないない心配、あなたが取ることができます私のテストを見てくださいクラスの書き方、あなたは一目で理解するでしょう

public class Test {     public static void main(String [] args){         Food food = new Bread(new Vegetable(new Cream(new Food( "Sausage"))));         System.out.println(food.make()) ;     } }いいえ、層ごとのカプセル化を参照してください内側から見たわけではありません。最も内側に新しいソーセージがあり、ソーセージの外側にクリームの層を包み、クリームの外側にI野菜の層を追加し、外側にパンを入れました。とても鮮やかではないですか?ハハ。このデザインパターンは実際の生活とまったく同じです。わかりますか? 手術の結果を見てみましょう。 サンドイッチの準備ができました~~~







 

4:アダプターモード
は、実際の変圧器のように、2つのまったく異なるものを接続します 

携帯電話の充電器に20Vの電圧が必要であるが、通常の電圧は220Vであるとします。このとき、220Vの電圧を20Vの電圧に変換するために変圧器が必要です。このようにして、変圧器は20Vの電圧を携帯電話に接続します。 。

public class Test {     public static void main(String [] args){         Phone phone = new Phone();         VoltageAdapterアダプター=新しいVoltageAdapter();         phone.setAdapter(adapter);         phone.charge();     } }






//携帯電話
クラスPhone {

    public static final int V = 220; //通常の電圧は220vで、これは定数です。

    プライベートVoltageAdapterアダプター;

    //充液publicvoid Charge
    (){         adapter.changeVoltage();     }

    public void setAdapter(VoltageAdapter adapter){         this.adapter = adapter;     } }


// Transformer
クラスVoltageAdapter {     //電圧を変更する関数     publicvoid changeVoltage(){         System.out.println( "Charging ...");         System.out.println( "Original Voltage:" + Phone.V + "V ");         System.out.println("変圧器変換後の電圧: "+(Phone.V-200)+" V ");     } }







 


5:ファクトリモード 
シンプルファクトリモード:抽象インターフェイス、抽象インターフェイスの複数の実装クラス、および抽象インターフェイスをインスタンス化するファクトリクラス

//抽象製品クラス
抽象クラスCar {     public void run();

    public void stop();
}

//特定の実装クラス
クラスベンツはCarを実装し     ます{         publicvoid run(){ System.out.println( "ベンツが開始しました...");     }


    public void stop(){         System.out.println( "ベンツが停止しました...");     } }


クラスFordはCarを実装し     ます{         publicvoid run(){ System.out.println( "Ford Started ...");     }


    public void stop(){         System.out.println( "Fordstopped ...");     } }


//工厂クラス
クラスファクトリ{     publicstatic Car getCarInstance(String type){         Car c = null;         if( "Benz" .equals(type)){             c = new Benz();         }         if( "Ford" .equals(type)){             c = new Ford();         }         return c;     } }










パブリッククラステスト{

    public static void main(String [] args){         Car c = Factory.getCarInstance( "Benz");         if(c!= null){             c.run();             c.stop();         } else {             System.out。 println( "この種の車を作ることはできません...");         }






    }

}

ファクトリメソッドパターン:抽象的なファクトリパターン、具体的なファクトリパターン、抽象的な製品パターン、具体的な製品パターンの4つの役割があります。具体的な製品をインスタンス化するファクトリクラスではなく、製品をインスタンス化する抽象ファクトリのサブクラスです。

//抽象製品ロール
publicinterface Moveable {     void run(); }

//推進製品角色
publicクラスPlaneはMoveableを実装し     ます{     @Overridepublic void run(){         System.out.println( "plane ....");     } }




パブリッククラスBroomはMoveableを実装し     ます{     @Overridepublic void run(){         System.out.println( "broom .....");     } }




//抽象ファクトリ
publicabstract class VehicleFactory {     abstract Moveable create(); }

//
推進工厂publicclass PlaneFactory extends VehicleFactory {     public Moveable create(){         return new Plane();     } }



public class BroomFactory extends VehicleFactory {     public Moveable create(){         return new Broom();     } }



//テストクラス         publicclass
Test {     public static void main(String [] args){ VehicleFactory factory = new BroomFactory();         Moveable m =         factory.create(); m.run();     } }抽象ファクトリパターン:およびfactoryメソッドパターンの違いは、ファクトリメソッドパターンのファクトリは単一の製品しか生成しないのに対し、抽象ファクトリパターンのファクトリは複数の製品を生成することです。







/磁工厂クラスpublicabstract
class AbstractFactory {     public abstract Vehicle createVehicle();     public abstract Weapon createWeapon();     public abstract Food createFood(); } //ここ工厂クラス、О中Food、Vehicle、Weapon是素クラス、public class DefaultFactory extends AbstractFactory {     @Override     public Food createFood(){         return new Apple();     }     @Override     public Vehicle createVehicle(){         return new Car();     }     @Override     public Weapon createWeapon(){         return new AK47();     } } // T试クラスパブリッククラステスト{





















    public static void main(String [] args){         AbstractFactory f = new DefaultFactory();         車両v = f.createVehicle();         v.run();         武器w = f.createWeapon();         w.shoot();         食品a = f.createFood();         a.printName();     } }








6:テンプレートメソッドパターンとは何ですか?

回答:テンプレートメソッドパターンとは、テンプレート構造を定義し、実装のために特定のコンテンツをサブクラスに延期することを指します。

利点

  • コードの再利用性を向上させる:コードの同じ部分を抽象親クラスに配置し、異なるコードを異なるサブクラスに配置します。
  • 逆制御が実現されます。親クラスによってそのサブクラスを呼び出す操作、およびサブクラスの特定の実現によるさまざまな動作の拡張により、逆制御が実現され、開閉の原則に準拠します。

果物を冷蔵庫に入れる例を考えてみましょう。たとえば、バナナを入れたい場合:冷蔵庫のドアを開ける→バナナを入れる→冷蔵庫のドアを閉める;別のリンゴを入れたい場合:冷蔵庫のドアを開ける→リンゴを入れる→冷蔵庫のドアを閉めます。保存されている果物のカテゴリが異なることを除いて、それらの間の動作パターンは同じであることがわかります。現時点では、テンプレートメソッドパターンはこの問題を解決するのに非常に適しています。実装コードは次のとおりです。

/\* \* 添加模板方法 \*/
abstract class Refrigerator {
    public void open() {
        System.out.println("开冰箱门");
    }
    public abstract void put();

    public void close() {
        System.out.println("关冰箱门");
    }
}
class Banana extends Refrigerator {
    @Override
    public void put() {
        System.out.println("放香蕉");
    }
}
class Apple extends Refrigerator {
    @Override
    public void put() {
        System.out.println("放苹果");
    }
}
/\* \* 调用模板方法 \*/
public class TemplateTest {
    public static void main(String[] args) {
        Refrigerator refrigerator = new Banana();
        refrigerator.open();
        refrigerator.put();
        refrigerator.close();
    }
}

プログラム実行結果:

冷蔵庫のドアを開ける

バナナを入れる

冷蔵庫のドアを閉めます

おすすめ

転載: blog.csdn.net/zhangleiyes123/article/details/108182097