デザインパターン(戦略パターン)

戦略モード

ではStrategyパターン、クラスまたはそのアルゴリズムの動作は、実行時に変更することができます。このタイプのデザインパターンは行動パターンです。
ストラテジーモードでさまざまなストラテジーを表すオブジェクトと、ストラテジーオブジェクトの変化に応じて動作が変化するコンテキストオブジェクトを作成します。ストラテジーオブジェクトは、コンテキストオブジェクトの実行アルゴリズムを変更します。

前書き

意図:一連のアルゴリズムを定義し、それらを1つずつカプセル化し、互換性を持たせます。
主な解決策:複数の同様のアルゴリズムの場合、if ... elseの使用は複雑であり、維持するのが困難です。
いつ使用するか:システムには非常に多くのクラスがあり、それらを区別するのはそれらの直接的な動作です。
解決方法:これらのアルゴリズムをクラスにカプセル化し、任意に置き換えます。
キーコード:同じインターフェースを実装します。
利点: 1。アルゴリズムは自由に切り替えることができます。2.複数の条件付き判断を使用しないでください。3.優れたスケーラビリティ。
短所: 1。戦略カテゴリが増加します。2.すべての戦略カテゴリは外の世界に公開される必要があります。
使用シナリオ: 1。システムに多くのクラスがあり、それらの違いが動作のみにある場合、戦略モードを使用すると、オブジェクトに多くの動作から1つの動作を動的に選択させることができます。2.システムは、いくつかのアルゴリズムの1つを動的に選択する必要があります。3.オブジェクトに多くの動作がある場合、これらの動作は、適切なパターンを使用しない場合に複数の条件付き選択ステートメントを使用することによってのみ実現できます。
注:システムに3つ以上の戦略がある場合は、戦略拡張の問題を解決するために混合モードの使用を検討する必要があります。

コード

//员工实体类
@Data
@AllArgsConstructor
public class Emp {
    
    

    private String name;
    private int age;
    private double salary;

}
//策略接口
public interface MyPredicate<T> {
    
    
    public boolean test(T t);
}
/**
* @description: 策略实现类,根据年龄过滤
* @author TAO
* @date 2021/3/27 20:29
*/
public class FilterEmpByAge implements MyPredicate<Emp>{
    
    
    @Override
    public boolean test(Emp emp) {
    
    
        return emp.getAge()>=35;
    }
}
/**
* @description: 策略实现类,根据工资过滤
* @author TAO
* @date 2021/3/28 14:12
*/
public class FilterEmpBySalary  implements MyPredicate<Emp> {
    
    
    @Override
    public boolean test(Emp emp) {
    
    
        return emp.getSalary() >= 5000;
    }

}

	//测试代码
	@Test
    public void test(){
    
    
        List<Emp> list=filterEmp(empList, new FilterEmpByAge());
        for (Emp emp:list){
    
    
            System.out.println(emp);
        }
        System.out.println("-----------------------------");

        List<Emp> list2=filterEmp(empList, new FilterEmpBySalary());
        for (Emp emp:list2){
    
    
            System.out.println(emp);
        }
    }

    public List<Emp> filterEmp(List<Emp> list,MyPredicate<Emp> mp){
    
    
        List<Emp> emps = new ArrayList<>();
        for (Emp emp:list){
    
    
            if (mp.test((emp))){
    
    
                emps.add(emp);
            }
        }
        return emps;
    }

おすすめ

転載: blog.csdn.net/CSDN877425287/article/details/115280858