English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
この記事では、Androidプログラミングデザインパターンの戦略パターンの例を紹介します。皆さんに参考にしていただくために、以下のように共有します:
一、紹介
ソフトウェア開発では、ある機能を実現するために複数のアルゴリズムや戦略があることがよくあります。実際の状況に応じて、異なるアルゴリズムや戦略を選択してその機能を完了します。例えば、ソートアルゴリズムでは、挿入ソート、マージソート、バブルソートなどを使用できます。
このような状況に対して、一般的な方法の一つは、複数のアルゴリズムを一つのクラスに記述することです。例えば、複数のソートアルゴリズムを提供する必要がある場合、これらのアルゴリズムを一つのクラスに記述し、各メソッドが具体的なソートアルゴリズムに対応します:もちろん、これらのソートアルゴリズムを統一されたメソッドに統合し、if...else...やcaseなどの条件判定文を通じて具体的なアルゴリズムを選択することもできます。この二つの実装方法はどちらもハードコーディングと呼ばれます。しかし、多くのアルゴリズムが一つのクラスに集約すると、そのクラスは肥大化し、メンテナンスコストが高くなり、メンテナンス中にエラーが発生しやすくなります。新しいソートアルゴリズムを追加する際には、アルゴリズムを統合したクラスのソースコードを修正する必要があります。これは明らかにOCP原則や单一責任原則に反しています。
これらのアルゴリズムや戦略を抽象化し、統一されたインターフェースを提供すると、異なるアルゴリズムや戦略にはそれぞれの実装クラスがあるため、プログラムのクライアントでは異なる実装オブジェクトを注入することで、アルゴリズムや戦略の動的置き換えを実現できます。このパターンの拡張性やメンテナンス性は非常に高く、私たちがこの節で言う戦略パターンです。
簡単に言えば、通常、問題に対して複数の解決策がある場合、最も簡単なのはifを使用することです。-elseまたはswitch-caseで異なる状況に応じて異なる解決策を選択する場合、コードの耦合性が高く、重く、メンテナンスが難しい場合、戦略パターンを使用することができます。
2、定義
戦略パターンは、一連のアルゴリズムを定義し、それぞれをエンブレスして、それらを相互に交換可能にします。戦略パターンは、アルゴリズムがクライアントを使用する独立した変更を可能にします。
3、使用シーン
同一タイプの問題に対する複数の処理方法があり、具体的な行動が異なる場合
同一タイプの操作を安全に封装する必要がある場合
同一の抽象クラスが複数のサブクラスを持っており、ifを使用する必要がある場合-elseまたはswitch-caseで具体的なサブクラスを選択する場合
4、戦略パターンのUMLクラス図
UMLクラス図:
Context:戦略を操作するコンテキスト環境。
Stragety:戦略の抽象。
ConcreteStrategyA、ConcreteStrategyB:具体的な戦略実装。
5、簡単な実装
要求:図書価格を計算する、初級会員には割引がなく、中級会員は割引9割引、高級会員は割引8割引。一般的な書き方は、if-elseで会員のレベルを判断し、対応する割引を計算します。以下では、戦略パターンを使用して実現します。
抽象割引クラス:
public interface MemberStrategy { /** * 書籍の価格を計算 * @param booksPrice 書籍の元価格 * @return 打割後の価格を計算 */ public double calcPrice(double booksPrice); }
初級会員割引クラス:
public class PrimaryMemberStrategy implements MemberStrategy{ /** * 初級会員割引 */ @Override public double calcPrice(double booksPrice) { System.out.println("初級会員には割引はありません"); return booksPrice; } }
中級会員割引クラス:
public class IntermediateMemberStrategy implements MemberStrategy{ /** * 中級会員割引 */ @Override public double calcPrice(double booksPrice) { System.out.println("中級会員の割引は、"10%"); return booksPrice * 0.9; } }
高級会員割引クラス:
public class AdvancedMemberStrategy implements MemberStrategy{ /** * 高級会員割引 */ @Override public double calcPrice(double booksPrice) { System.out.println("プレミアムメンバーの割引は"}}20%")); return booksPrice * 0.8; } }
価格クラス:
public class Price { //具体的な戦略オブジェクトを持っています private MemberStrategy strategy; /** * コンストラクタ、具体的な戦略オブジェクトを渡します * @param strategy 具体的な戦略オブジェクト */ public Price(MemberStrategy strategy){ this.strategy = strategy; } /** * 書籍の価格を計算 * @param booksPrice 書籍の元価格 * @return 打割後の価格を計算 */ public double quote(double booksPrice){ return this.strategy.calcPrice(booksPrice); } }
クライアント:
public class Client { public static void main(String[] args) { //使用する必要のある戦略オブジェクトを選択および作成 MemberStrategy strategy1 = new AdvancedMemberStrategy(); //環境の作成 Price price = new Price(strategy1); //価格計算 double quote = price.quote(300); System.out.println("本の最終価格は:" + quote); } }
結果:
プレミアムメンバーの割引は20% 本の最終価格は:240.0
六、戦略パターンと工場パターンの違い
工場パターン | 戦略パターン |
---|---|
作成型のデザインパターン | 行動型のデザインパターン |
オブジェクトの作成に注目 | 行動の選択に注目 |
黒箱(具体的な実現プロセスを知る必要はありません) | 白箱(具体的な実現プロセスを知っている) |
七、Androidソースコードの戦略パターンの実現
技術の発展に伴い、エンジニアたちはユーザーエクスペリエンスやユーザーインタラクションをますます重視しています。そのため、アニメーションは多くのアプリケーションで不可欠な部分となり、シンプルなガイドページもアニメーション効果を持たせ、ボタンの非表示もフェードイン/フェードアウトのアニメーションを加える必要があります。アニメーションの実現原理は短い時間内に画面を素早く切り替えることであり、この切り替えの頻度は人間の目がカクツキを感じないようにする必要があります。例えば、標準的な映画は24フレーム/秒。在比较流畅时,Android上のアニメーションは達成できます60フレーム/秒、人間の目には間隔がほとんど見えませんので、このアニメーションは非常に滑らかです。
アニメーションだけでは私たちのニーズを満たすことはありません。アニメーションの実行中に、私たちは動的な効果も必要とします。これは映画のスローモーションに少し似ており、時には少し遅く、時には少し速くする必要があります。これらの動的な効果は、TimeInterpolatorを通じて実現されます。私たちはAnimationオブジェクトに異なるイテレータを設定することで、異なる動的な効果を実現できます。
LinearInterpolator、AccelerateInterpolator、CycleInterpolatorなどがInterpolatorを実装し、getInterpolator(float input)を使用して現在の時間パーセンテージを取得し、アニメーションの属性値を計算します。
第8章、まとめ
戦略パターンは主にアルゴリズムを分離するために使用され、同じ行動抽象の下で異なる具体的な実装戦略があります。このパターンは、抽象を定義し、異なる実装を注入することで非常に良い可拡張性を示しています。
优点:
構造が明確で、使いやすく直感的です。
コヒーションが比較的低く、拡張が簡単です。
操作の封装がより徹底しており、データがより安全です。
欠点:
戦略が増えるにつれて、サブクラスも増えていきます。
Androidに関するさらに詳しい内容に興味を持つ読者は、このサイトの特集をチェックしてください:《Android開発入門と進階ガイド》、《Androidデバッグテクニックとよくある問題の解決方法集》、《Android基本コンポーネントの使い方要約》、《AndroidビューViewの使い方要約》、《Androidレイアウトlayoutの使い方要約》および《Androidコントロールの使い方要約》
この記事で述べたことが、皆さんのAndroidプログラム設計に役立つことを願っています。
声明:この記事の内容はインターネットから収集され、著作権者に帰属します。インターネットユーザーが自発的に貢献し、アップロードした内容であり、このサイトは所有権を持ちません。また、人工編集は行われておらず、関連する法的責任も負いません。著作権侵害の可能性のある内容が見つかった場合は、メールを送信してください:notice#oldtoolbag.com(メール送信時は、#を@に変更してください)で通報し、関連する証拠を提供してください。一旦確認がとりつけば、このサイトは侵害される可能性のある内容をすぐに削除します。