点击链接加入群聊【java菜鸟学习】:https://jq.qq.com/?_wv=1027&k=5afU7nS
群号:124569404
设计模式(java)-策略模式
自己理解:通过实现接口,接口调用方法时具体的实现是子类完成的.
如下代码所示,当前apple有颜色和重量两个属性,如果某一个需求需要统计绿色的Apple有多少个,那么很简单,写一个根据color颜色去区分的方法即可,如果有来一个需求,要根据红色去区分,大不了又加一个方法…随着需求的增多,这种重复的方法也越来越多,且程序的健壮性不好,现在使用策略模式(感觉策略模式像匿名内部类实现的一个变种 ,就像 这种方式 , 一个方法的入参是接口,实际上传入的入参参数是接口的实现 ,这就是我理解的策略模式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}).start();
new Thread(() -> System.out.println(Thread.currentThread().getName())).start();
)
import lombok.Builder;
import lombok.Data;
import lombok.ToString;
/**
* ClassName: Apple
* @Description:
* @author leegoo
* @date 2019年02月15日
*/
@Builder
@Data
@ToString
public class Apple {
private String color;
private Integer weight;
public Apple(String color, Integer weight) {
this.color = color;
this.weight = weight;
}
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* ClassName: Demo01
*
* @author leegoo
* @Description:
* @date 2019年02月15日
*/
public class Demo01 {
private static List<Apple> list = Arrays.asList(
Apple.builder().color("green").weight(160).build(),
Apple.builder().color("green").weight(150).build(),
Apple.builder().color("red").weight(160).build()
);
//可标记也可不标记
@FunctionalInterface
public interface FifterApple {
boolean fifter(Apple apple);
}
static List<Apple> fifterApple(FifterApple fifterApple){
List<Apple> apples = new ArrayList<>();
list.forEach(e->{
if (fifterApple.fifter(e))
apples.add(e);
});
return apples;
}
public static void main(String[] args) {
//以后做统计的话就只需要改这个地方就可以了
List<Apple> apples = fifterApple(k -> k.getColor().equals("red"));
System.out.println(apples);
}
}