初尝策略模式~真香

简介: 初尝策略模式~真香

策略模式是啥???
相信很多小伙伴第一次听到策略模式都觉得很懵逼,而且觉得它高深莫测... 也肯定想知道这种模式是用来干嘛的...

那么今天我们就来聊聊策略模式...

不跟你多BB直接上代码:

/**

  • Description:

*

  • @author zpzp6
  • @create 2020/2020/9/9/21:07
  • @since 1.0.0

*/
public class AgeTest {

// 此处Person为Person类获得的对象。参数分别对应 name(姓名),age(年龄),sex(性别),hobby(爱好)
Person p = new Person("荣荣", 19, "女", "旅游");
Person p2 = new Person("小舞", 18, "女", "跳舞");
Person p3 = new Person("史泰龙", 12, "男", "run");
Person p4 = new Person("成龙", 10, "男", "woman");
List<Person> people = Arrays.asList(p, p2, p3, p4);


}
这是一个普通的人员的一个类,此时如果想让你获得年龄大于10的List集合,你会怎么写?

相信很多小伙伴都会写,这还不简单!

/**

  • Description:

*

  • @author zpzp6
  • @create 2020/2020/9/9/21:07
  • @since 1.0.0

*/
public class AgeTest {

Person p = new Person("荣荣", 19, "女", "旅游");
Person p2 = new Person("小舞", 18, "女", "跳舞");
Person p3 = new Person("史泰龙", 12, "男", "run");
Person p4 = new Person("成龙", 10, "男", "woman");
List<Person> people = Arrays.asList(p, p2, p3, p4);

@Test
public void test(){
    List<Person> personList =new ArrayList<>();
    for (Person person : people) {
        if(person.getAge()>10){
            personList.add(person);
        }
    }
}


}

那如果现在想获得性别为女的人员呢? 很多小伙伴肯定也觉得这根本就不是事儿!

/**

  • Description:

*

  • @author zpzp6
  • @create 2020/2020/9/9/21:07
  • @since 1.0.0

*/
public class AgeTest {

Person p = new Person("荣荣", 19, "女", "旅游");
Person p2 = new Person("小舞", 18, "女", "跳舞");
Person p3 = new Person("史泰龙", 12, "男", "run");
Person p4 = new Person("成龙", 10, "男", "woman");
List<Person> people = Arrays.asList(p, p2, p3, p4);

@Test
public void test(){
    List<Person> personList =new ArrayList<>();
    for (Person person : people) {
        if(person.getAge()>10){
            personList.add(person);
        }
    }
}

@Test
public void tests(){
    List<Person> personList =new ArrayList<>();
    for (Person person : people) {
        if(person.getSex().equals("女")){
            personList.add(person);
        }
    }
    System.out.println(personList);
}


}

那现在如果让你获得年龄长度大于2的人员集合,想让你获得爱好跳舞的人员,想让你...

是不是每个要求都要写一个长长的方法去判断?

其实我们会发现,其实要改的也就那么一句:

if(person.getXxx() 条件 xxx){

personList.add(person);

}
因此,我们可以采用策略模式来简化我们的代码。

首先,我们可以先声明一个接口。
package service;

/**

  • @author zp
  • @Title:
  • @Package
  • @Description:
  • @date 2020/2020/9/9/20:45

*/
public interface MyPredicate {

public boolean test(T t);

}
然后,对于接口实现一个实现类。这个实现类就是用来做限制的。比如年龄大于10啊,性别为女啊...等等。 这里先用年龄进行测试。
/**

  • FileName: AgeImpl
  • Author: zp
  • Date: 2020/2020/9/9/20:45
  • Description:

*/
package service;

import bean.Person;

/**

  • Description:
  • @author zpzp6
  • @create 2020/2020/9/9/20:45
  • @since 1.0.0

*/
public class AgeImpl implements MyPredicate{

@Override
public boolean test(Person person) {
    return person.getAge()>10;
}

}
之后,就是写一个策略模式的一个通用方法。
public List getPersonListByAge(List lists, MyPredicate mp) {

    List<Person> list = new ArrayList<>();
    for (Person person : lists) {
        if (mp.test(person)) {
            list.add(person);
        }
    }
    return list;
}

最后,就可以随心所欲的使用你的限制条件的实现类来完成想要的操作了。这里我又写了一个通过姓名来作为限制条件的实现类:
/**

  • FileName: NameImpl
  • Author: zp
  • Date: 2020/2020/9/9/21:15
  • Description:

*/
package service;

import bean.Person;

/**

  • Description:
  • @author zpzp6
  • @create 2020/2020/9/9/21:15
  • @since 1.0.0

*/
public class NameImpl implements MyPredicate{

@Override
public boolean test(Person person) {
    return person.getName().length()>1;
}

}
然后就是将实现类传进通用方法就行了。
/**

  • FileName: AgeTest
  • Author: zp
  • Date: 2020/2020/9/9/21:07
  • Description:

*/

import bean.Person;
import org.junit.Test;
import service.AgeImpl;
import service.MyPredicate;
import service.NameImpl;
import test.People;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**

  • Description:

*

  • @author zpzp6
  • @create 2020/2020/9/9/21:07
  • @since 1.0.0

*/
public class AgeTest {

Person p = new Person("荣荣", 19, "女", "旅游");
Person p2 = new Person("小舞", 18, "女", "跳舞");
Person p3 = new Person("史泰龙", 12, "男", "run");
Person p4 = new Person("成龙", 10, "男", "woman");
List<Person> people = Arrays.asList(p, p2, p3, p4);




public List<Person> getPersonListByAge(List<Person> lists, MyPredicate<Person> mp) {
    List<Person> list = new ArrayList<>();
    for (Person person : lists) {
        if (mp.test(person)) {
            list.add(person);
        }
    }
    return list;
}



@Test
public void getPeopleList(){
    //通过年龄
    List<Person> personListByAge = getPersonListByAge(people, new AgeImpl());
    personListByAge.forEach(System.out::println);

    System.out.println("------------------------------------------------");
    //通过姓名
    List<Person> personListByName = getPersonListByAge(people, new NameImpl());
    personListByName.forEach(System.out::println);
}

}

比较比较之前的那种方式,如果让你像之前那样每个条件写个方法,那估计要写老长老长了吧!

怎么样?有没有觉得清爽很多呢?

代码是变轻爽了。但其中的东西需要自己好好揣摩一下。另外,这里的代码还有可以优化的地方。不知道你能不能看到呢?

其实就是使用JDK1.8 的 lambda表达式来处理接口的实现。

好了。关于策略模式暂时就先介绍到这里,我们下期再见~~

目录
相关文章
|
6月前
|
设计模式 Java 开发者
设计模式揭秘:Java世界的七大奇迹
【4月更文挑战第7天】探索Java设计模式:单例、工厂方法、抽象工厂、建造者、原型、适配器和观察者,助你构建健壮、灵活的软件系统。了解这些模式如何提升代码复用、可维护性,以及在特定场景下的应用,如资源管理、接口兼容和事件监听。掌握设计模式,但也需根据实际情况权衡,打造高效、优雅的软件解决方案。
44 0
|
6月前
|
设计模式 算法 前端开发
【面试题】什么是策略模式?用了策略模式之后,再也不用写那么多 if else 了,真香!
【面试题】什么是策略模式?用了策略模式之后,再也不用写那么多 if else 了,真香!
|
6月前
|
设计模式
二十三种设计模式:解密职责链模式-购物优惠活动的设计艺术
二十三种设计模式:解密职责链模式-购物优惠活动的设计艺术
|
6月前
|
设计模式 算法
【设计模式】阿里终面:你觉得这个例子是策略模式吗?
【设计模式】阿里终面:你觉得这个例子是策略模式吗?
56 1
|
6月前
|
前端开发 算法 JavaScript
快来get策略模式,告别编程困惑,轻松变身编程高手✨
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
设计模式 算法 Java
JAVA设计模式第十二讲:大厂实践 - 美团: 设计模式二三事
JAVA设计模式第十二讲:大厂实践 - 美团: 设计模式二三事
|
Dubbo Java 应用服务中间件
策略模式史上最佳实践,没有之一!!!
策略模式史上最佳实践,没有之一!!!
170 0
|
设计模式 SQL Java
有点狠有点猛,我用责任链模式重构了业务代码
文章开篇,抛出一个老生常谈的问题,学习设计模式有什么作用? 设计模式主要是为了应对代码的复杂性,让其满足开闭原则,提高代码的扩展性 另外,学习的设计模式 一定要在业务代码中落实,只有理论没有真正实施,是无法真正掌握并且灵活运用设计模式的 这篇文章主要说 责任链设计模式,认识此模式是在读 Mybatis 源码时, Interceptor 拦截器主要使用的就是责任链,当时读过后就留下了很深的印象(内心 OS:还能这样玩)
|
Dubbo Java 应用服务中间件
炫技?No? only 策略模式
Autowire作用于方法时Spring会先实例化所有Bean,然后根据配置进行扫描,当检测到@Autowired后进行注入,注入时调用这个方法,也就是当启动完容器,map已经存放了实体类映射关系。
96 0
炫技?No? only 策略模式
|
设计模式 缓存 JavaScript
设计模式(二)—— 创建型模式|牛气冲天新年征文
设计模式(二)—— 创建型模式|牛气冲天新年征文
84 0