Patrón de diseño (patrón de estrategia)

Modo de estrategia

En Strategy Pattern, el comportamiento de una clase o su algoritmo se puede cambiar en tiempo de ejecución. Este tipo de patrón de diseño es un patrón de comportamiento.
En el modo de estrategia, creamos objetos que representan varias estrategias y un objeto de contexto cuyo comportamiento cambia a medida que cambia el objeto de estrategia. El objeto de estrategia cambia el algoritmo de ejecución del objeto de contexto.

Introducción

Intención: definir una serie de algoritmos, encapsularlos uno por uno y hacerlos intercambiables.
La solución principal: en el caso de múltiples algoritmos similares, el uso de if ... else es complicado y difícil de mantener.
Cuándo usarlo: Un sistema tiene muchas, muchas clases, y lo que las distingue es su comportamiento directo.
Cómo resolverlo: Encapsule estos algoritmos en una clase y reemplácelos arbitrariamente.
Código clave: implementar la misma interfaz.
Ventajas: 1. El algoritmo se puede cambiar libremente. 2. Evite el uso de múltiples juicios condicionales. 3. Buena escalabilidad.
Desventajas: 1. Las categorías de estrategia aumentarán. 2. Todas las categorías de estrategias deben estar expuestas al mundo exterior.
Escenarios de uso: 1. Si hay muchas clases en un sistema, y ​​la diferencia entre ellas está solo en su comportamiento, entonces el uso del modo de estrategia puede hacer que un objeto elija dinámicamente un comportamiento entre muchos comportamientos. 2. Un sistema necesita seleccionar dinámicamente uno de varios algoritmos. 3. Si un objeto tiene muchos comportamientos, estos comportamientos solo se pueden lograr mediante el uso de múltiples declaraciones de selección condicional si no usan patrones apropiados.
Nota: Si hay más de cuatro estrategias en un sistema, debe considerar el uso de un modo mixto para resolver el problema de la expansión de la estrategia.

Código

//员工实体类
@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;
    }

Supongo que te gusta

Origin blog.csdn.net/CSDN877425287/article/details/115280858
Recomendado
Clasificación