[設計モード]戦略モード

12015 ワード

戦略モデル?
話が難しい.開発側の用語では,このように命名する際に抽象的すぎると考えることが多い.(いずれにしても、開発コミュニティは英語圏の国を中心に発展してきたもので、英語を翻訳する開発者になってこれらの言語を翻訳する過程で生じる現象です…)
要するに,戦略モデルはインタフェースと深い関連がある.
しかし、これまで私が使ってきたインタフェースは主にあるインタフェースを実現するクラスが1です.移動話をする停止して、私たちはこれらの機能を実現しなければなりません!類似の用途に用いる.
すなわち,具体的な実装コードは実装クラスによって定義されるが,少なくともこれらの機能を備えなければならない.表示に使用します.
public interface Robot {
	void move();
    void speak();
    void stop();
}

public class RobotA implements Robot {
	@Override
    public void move() {
    	// 보폭 10cm로 이동
    }
    
    @Override
    public void speak() {
    	// 영어를 사용
    }
}

public class RobotB implements Robot {
	@Override
    public void move() {
    	// 보폭 10cm로 이동
    }
    
    @Override
    public void speak() {
    	// 한국어를 사용
    }
}
ちょっと待って.違うロボットだけど...同じ機能を異なる方法で実現するものもあれば、異なる方法で実現するものもある.
そうすると、機能拡張のたびにコードを修正する必要があります...
どのようにして開放的な原則をよりよく守りますか?
しかし、戦略モデルでは、インタフェースを使用する方法が少し異なります.
すなわち,ある一般的な機能を持つクラスに焦点を当てるよりも,一つの機能を実装体クラスに変える.このように、上記の場合、クラスが有する機能の再利用性を実現することがより良く、これらの機能を修正する必要がある場合、毎回すべての実装クラスを修正する必要はない.
すなわち,1つの機能は実装クラスとして定義され,これらの機能を持つオブジェクトはDI方式でこれらの機能を注入するだけでよい.
ちょっと複雑な話ですが...サンプルコードを次に示します
public interface MoveStrategy {
	void move();
}

public class Walk implements MoveStrategy {
	@Override
    public void move() {
    	// 보폭 10cm로 이동
    }
}

public interface SpeakStrategy {
	void speak();
}

public class SpeakEnglish implements SpeakStrategy {
	@Overrid
    public void speak() {
    	// 영어를 사용
    }
}

public class SpeakKorean implements SpeakStrategy {
	@Overrid
    public void speak() {
    	// 한국어를 사용
    }
}

public class Robot {
	private final MoveStrategy moveStrategy;
    private final SpeakStrategy speakStrategy;
    
    public Robot (MoveStrategy moveStrategy, SpeakStrategy speakStrategy) {
    	this.moveStrategy = moveStrategy;
        this.speakStrategy = speakStrategy;
    }

    public void move() {
    	moveStrategy.move();
    }
    
    public void speak() {
    	speakStrategy.speak();
    }
}

public class RobotApplication {
  public static void main(String[] args) {
		Robot robotA = new Robot(new Walk(), new SpeakEnglish());
        Robot robotB = new Robot(new Walk(), new SpeakKorean());
        
        robotA.speak(); // 영어로 말한다
        robotB.speak(); // 한국어로 말한다
  }
}
参考資料
https://www.youtube.com/watch?v=vNsZXC3VgUA