Padrão de design (padrão de estratégia)

Modo de estratégia

No Strategy Pattern, o comportamento de uma classe ou seu algoritmo pode ser alterado em tempo de execução. Este tipo de padrão de design é um padrão comportamental.
No modo de estratégia, criamos objetos que representam várias estratégias e um objeto de contexto cujo comportamento muda conforme o objeto de estratégia muda. O objeto de estratégia muda o algoritmo de execução do objeto de contexto.

Introdução

Objetivo: definir uma série de algoritmos, encapsulá-los um por um e torná-los intercambiáveis.
A solução principal: no caso de vários algoritmos semelhantes, o uso de if ... else é complicado e difícil de manter.
Quando usar: um sistema tem muitas, muitas classes, e o que as distingue é seu comportamento direto.
Como resolver: Encapsule esses algoritmos em uma classe e substitua-os arbitrariamente.
Código-chave: implemente a mesma interface.
Vantagens: 1. O algoritmo pode ser alternado livremente. 2. Evite usar vários julgamentos condicionais. 3. Boa escalabilidade.
Desvantagens: 1. As categorias de estratégia aumentarão. 2. Todas as categorias de estratégia precisam ser expostas ao mundo exterior.
Cenários de uso: 1. Se houver muitas classes em um sistema, e a diferença entre elas está apenas em seu comportamento, então o uso do modo de estratégia pode fazer um objeto escolher dinamicamente um comportamento entre muitos comportamentos. 2. Um sistema precisa selecionar dinamicamente um dos vários algoritmos. 3. Se um objeto tem muitos comportamentos, esses comportamentos só podem ser alcançados usando várias instruções de seleção condicional se não usarem os padrões apropriados.
Nota: Se houver mais de quatro estratégias em um sistema, você precisa considerar o uso de um modo misto para resolver o problema de expansão da estratégia.

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;
    }

Acho que você gosta

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