自宅で流行が退屈しているので、デザインモードの上に行きます。非常にそれに数回、各時間の利益を読んで、「ヘッドファーストデザインパターン」の本をお勧めします。
Strategyパターンのコンセプト
Strategyパターンは、そう、彼らはお互いを置き換えることができ、このモードでは、アルゴリズムは、アルゴリズムを使用して、クライアントから独立して変化することができます、それをカプセル化するアルゴリズムのファミリーを定義します。
設計原則に関連する:アプリケーションは場所の変更を必要とするかもしれない識別、独立したそれらを置く、およびコードそのミックスを変更する必要はありません。
人気はこの原則を話しパッケージを変更し、以前に安定したコードの区別新しい要件に必要なコードを配置することです。
この原則を考えてのもう一つの方法:部分は、簡単に変更または変更を必要としない他の部分に影響を与えずに、このセクションに拡張することができるように、除去し、カプセル化によって異なります。
ほぼすべてのデザインパターンは、システムの他の部分に影響を与えないだろう「変更の一部を」作るための方法を提供します。
特定のポリシーモード、ブックでの使用のアヒルの例を説明するための例を与えるために、私たちはさまざまなアヒルが、異なる動作を実装たとえば、呼び出すことはありません、おもちゃのアヒルが飛んでいないだろう、本物のアヒルのフライを呼ぶようにする必要があり、コードを生成しません。冗長性、そして私たちは言及している設計原理に従ってインチ
サンプルコード
悪い実装を初めて目には、最初はこのクラスのすべての継承抽象クラスのアヒル、アヒルです。
public abstract class Duck {
public void swim() {
System.out.println("鸭子游泳");
}
public abstract void display();
}
飛行と呼ばれるインタフェースを言うようになった、これらの行為は、これら2つのインターフェイスを実装する必要がありアヒル。
public interface Flyable {
void fly();
}
public interface Quackable {
void quack();
}
ここでもアヒルのいくつかの種類があります。
public class MallardDuck extends Duck implements Flyable, Quackable {
@Override
public void display() {
System.out.println("Mallard");
}
@Override
public void fly() {
System.out.println("fly");
}
@Override
public void quack() {
System.out.println("quack");
}
}
public class RedheadDuck extends Duck implements Flyable, Quackable {
@Override
public void display() {
System.out.println("Red head");
}
@Override
public void fly() {
System.out.println("read head fly");
}
@Override
public void quack() {
System.out.println("quack");
}
}
public class RubberDuck extends Duck implements Quackable {
@Override
public void display() {
System.out.println("Rubber");
}
@Override
public void quack() {
System.out.println("quack");
}
}
悪い実装のこの種のは、それを感じますか?コードの冗長性は、アヒルの数はその動作を変更する場合は、あまりにも多くのコードを繰り返し、それは悪夢ああだろう。
加えて、アプリケーションの変更とは独立しを識別するために、私たちの前の設計原則に戻って、そしてコード変数の不変を混在していません。
別々の変化と不変部分
この目標を打つために、我々は「飛ぶ」と2の「いんちき」行動することを、とても私たちの観点から、上記の例では、彼らの行動を達成するために、2つのクラス、およびダッククラスに依存しないクラスを作成します。このような呼び出しの振る舞いとして、我々はすべての後に、アヒルのために同じ名前ではありません、「いんちき」、「いんちき」と「呼び出すことはありません」を達成することができます。
:動作がすでに指摘しているので、今度は設計原理を含み、その動作の設計に続いて、インタフェースのプログラミングのための、というよりもプログラミング。
これはどういう意味、フォーカスを描きますか?インタフェースのプログラミングのために、我々はアヒルを交換する「QuackBehaviorの行動をインタフェースを使用しての代わりに、例えば、「FlyBehavior」としながら、「ダック」クラスであり、行動は、彼らが、実施を通じてパフォーマンスに固有のものではない、この場合は懸念している取りましたインターフェースのこの2つのクラスの振る舞いによって達成するための方法、具体的な実装を呼び出すための唯一の責任を負います。
2つの2中の方法、最初の方法との違いを比較するために、我々はアヒルを変更することによってのみ変更する必要があるときは、これらの2つの行為、クラスのアヒルを達成することに焦点を当て、変更する方法のインタフェースを実装することにより取得します変更するコード。そして背後の一種は、インターフェイスの動作性能を使用してサブクラスアヒル、実際の実装は、アヒルのサブクラスで縛らない、行動のクラスによって達成されます。これは、便利な変更を提供します。
コードを見てみましょう。
戦略モードコードの実装
抽象クラスをアヒル、
public abstract class Duck {
QuackBehavior quackBehavior;
FlyBehavior flyBehavior;
public abstract void display();
public void performQuack() {
quackBehavior.quack();
}
public void performFly() {
flyBehavior.fly();
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
、我々は二つのインターフェース、「QuackBehavior」「FlyBehaviorは」アクションperformQuackと二つの方法performFlyを実行するには、以下の2つの設定方法が含まれ、我々は、アヒルのメソッドの動作が変更できます。
インタフェース、およびその実装クラスの飛行行動で見てみましょう。
public interface FlyBehavior {
void fly();
}
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("can't fly");
}
}
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("Fly with Wings");
}
}
ここでは非常にシンプルなインターフェイス、2つの実装クラスです。同様に、同様の呼び出しインターフェース構造。
public interface QuackBehavior {
void quack();
}
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("Quack");
}
}
public class Squeak implements QuackBehavior {
@Override
public void quack() {
System.out.println("Squeak");
}
}
public class MuteQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("<< Silence >>");
}
}
二人はクラスのアヒル。
public class MalardDuck extends Duck {
@Override
public void display() {
System.out.println("Malard");
}
public MalardDuck(FlyBehavior flyBehavior, QuackBehavior quackBehavior) {
this.flyBehavior = flyBehavior;
this.quackBehavior = quackBehavior;
}
}
public class RedHeadDuck extends Duck {
@Override
public void display() {
System.out.println("red head duck");
}
public RedHeadDuck(FlyBehavior flyBehavior, QuackBehavior quackBehavior) {
this.flyBehavior = flyBehavior;
this.quackBehavior = quackBehavior;
}
}
テストカテゴリ
public class Test {
public static void main(String[] args) {
MalardDuck malardDuck = new MalardDuck(new FlyWithWings(), new Quack());
malardDuck.display();
malardDuck.performFly();
malardDuck.performQuack();
System.out.println("-----------");
RedHeadDuck redHeadDuck = new RedHeadDuck(new FlyNoWay(), new MuteQuack());
redHeadDuck.display();
redHeadDuck.performQuack();
redHeadDuck.performFly();
System.out.println("change ---------");
redHeadDuck.display();
redHeadDuck.setFlyBehavior(new FlyWithWings());
redHeadDuck.performFly();
redHeadDuck.setQuackBehavior(new Quack());
redHeadDuck.performQuack();
}
}
私たちは、アヒルのクラスを変更することなく、我々は行動を増やす必要があるときに、あなただけの新しいクラスの振る舞い、再割り当てアヒルの行動缶を追加することができ、設定方法によってアヒルの動作を変更する、アヒルの動作を指定し、コンストラクタ達成。
設計原理の使用もあり、多目的組み合わせ、あまり継承は。
家族のアルゴリズムのように、だけでなく、長い正しいインタフェース規格の組み合わせが可能とされるオブジェクトの振る舞いに沿って「実行時の動作時に動的に変更すること」としてパッケージ化することができるだけでなく、優れた柔軟性と確立システムの組み合わせを使用してください。
逃げるために全体のポリシーモードをここに。その後、新しいアイデアは、それを追加し、そこにあります。