徒手撸设计模式-过滤器模式

概念

过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。

参考链接: 过滤器模式 | 菜鸟教程

代码案例

公共类

public final class StFlag {
    public StFlag() {
    }

    /**
     * 汽车
     */
    public static final String CAR="CAR";
    /**
     * 自行车
     */
    public static final String BICYCLE="BICYCLE";
    /**
     * 蓝色
     */
    public static final String BLUE="BLUE";
    
    /**
     * 交通工具类型-宝马
     */
    public static final String TRANSPORT_TYPE_BMW="BMW";
    /**
     * 交通工具类型-奔驰
     */
    public static final String TRANSPORT_TYPE_BENZ="BENZ";
    /**
     * 交通工具类型-捷安特
     */
    public static final String TRANSPORT_TYPE_GIANT="GIANT";
    /**
     * 交通工具类型-美利达
     */
    public static final String TRANSPORT_TYPE_MERIDA="MERIDA";
}

写一个实体类,有三个属性

/**
 * 交通工具实体类
 */
@Getter
@AllArgsConstructor
@Setter
@ToString
public class Transport {
    private String name;
    private String type;
    private String colour;
}

写一个接口,用于过滤匹配的数据

public interface Match {
    public List<Transport> getMatches(List<Transport>  transports);
}

五个实现类

/**
 * 自行车匹配实现类
 */
public class BicycleMatch implements Match {
    @Override
    public List<Transport> getMatches(List<Transport> transports) {
        List<Transport> transportsBicycle = new ArrayList<>();
        for (Transport transport : transports) {
            if (transport.getType().equalsIgnoreCase(StFlag.BICYCLE)) {
                transportsBicycle.add(transport);
            }
        }
        return transportsBicycle;
    }
}
/**
 * 汽车匹配实现类
 */
public class CarMatch implements Match {
    @Override
    public List<Transport> getMatches(List<Transport> transports) {
        List<Transport> transportsCar = new ArrayList<>();
        for (Transport transport : transports) {
            if (transport.getType().equalsIgnoreCase(StFlag.CAR)) {
                transportsCar.add(transport);
            }
        }
        return transportsCar;
    }
}
/**
 * 颜色匹配实现类
 */
public class BlueMatch implements Match {
    @Override
    public List<Transport> getMatches(List<Transport> transports) {
        List<Transport> transportsBlue = new ArrayList<>();
        for (Transport transport : transports) {
            if (transport.getColour().equalsIgnoreCase(StFlag.BLUE)) {
                transportsBlue.add(transport);
            }
        }
        return transportsBlue;
    }
}
/**
 * 且运算
 */
public class AndMatch implements Match {
    private Match bicycleMatch;
    private Match blueMatch;

    public AndMatch(Match bicycleMatch, Match blueMatch) {
        this.bicycleMatch = bicycleMatch;
        this.blueMatch = blueMatch;
    }

    @Override
    public List<Transport> getMatches(List<Transport> transports) {
        List<Transport> cars = blueMatch.getMatches(transports);
        return bicycleMatch.getMatches(cars);
    }
}
/**
 * 或运算
 */
public class OrMatch implements Match {
    private Match bicycleMatch;
    private Match carMatch;

    public OrMatch(Match bicycleMatch, Match carMatch) {
        this.bicycleMatch = bicycleMatch;
        this.carMatch = carMatch;
    }

    @Override
    public List<Transport> getMatches(List<Transport> transports) {
        List<Transport> cars = carMatch.getMatches(transports);
        List<Transport> bicycles = bicycleMatch.getMatches(transports);
        for (Transport car : cars) {
            if (!bicycles.contains(car)){
                bicycles.add(car);
            }
        }
        return bicycles;
    }
}

测试主类

/**
 * 设计模式控制器
 */
@RestController
@RequestMapping("/designPattern")
@Slf4j
public class DesignController {

    @PostMapping("/filter")
    public ResponseModel filter(@RequestBody List<Transport> transports) {
        log.info("DesignController--- filter --start--");

        Match carMatch = new CarMatch();
        Match blueMatch = new BlueMatch();
        BicycleMatch bicycleMatch = new BicycleMatch();
        Match andMatch = new AndMatch(bicycleMatch,blueMatch);
        Match orMatch = new OrMatch(bicycleMatch, carMatch);
        List<Transport> carList = carMatch.getMatches(transports);
        List<Transport> blueList = blueMatch.getMatches(transports);
        List<Transport> bicycleList = bicycleMatch.getMatches(transports);
        List<Transport> andList = andMatch.getMatches(transports);
        List<Transport> orList = orMatch.getMatches(transports);
        Map<String, List> result= new HashMap<>();
        result.put("carList",carList);
        result.put("blueList",blueList);
        result.put("bicycleList",bicycleList);
        result.put("andList",andList);
        result.put("orList",orList);
        log.info("DesignController--- filter --end--");
        log.info("result is : {}", JSON.toJSONString(result,true));
        return new ResponseModel("过滤器模式完成", 200, result);
    }
}

测试案例

2022-06-22 01:27:43.211 INFO  DesignController--- filter --start-- 【http-nio-8081-exec-2】【DesignController:60】
2022-06-22 01:27:43.214 INFO  DesignController--- filter --end-- 【http-nio-8081-exec-2】【DesignController:78】
2022-06-22 01:27:43.222 INFO  result is : {
	"andList":[
		{
			"colour":"blue",
			"name":"giant",
			"type":"bicycle"
		},
		{
			"colour":"blue",
			"name":"feige",
			"type":"bicycle"
		}
	],
	"bicycleList":[
		{"$ref":"$.andList[0]"},
		{"$ref":"$.andList[1]"},
		{
			"colour":"write",
			"name":"fenghuang",
			"type":"bicycle"
		}
	],
	"orList":[
		{"$ref":"$.andList[0]"},
		{"$ref":"$.andList[1]"},
		{"$ref":"$.bicycleList[2]"},
		{
			"colour":"blue",
			"name":"bmw",
			"type":"car"
		},
		{
			"colour":"yellow",
			"name":"benz",
			"type":"car"
		},
		{
			"colour":"blue",
			"name":"poche",
			"type":"car"
		}
	],
	"blueList":[
		{"$ref":"$.orList[3]"},
		{"$ref":"$.andList[0]"},
		{"$ref":"$.andList[1]"},
		{"$ref":"$.orList[5]"}
	],
	"carList":[
		{"$ref":"$.orList[3]"},
		{"$ref":"$.orList[4]"},
		{"$ref":"$.orList[5]"}
	]
} 【http-nio-8081-exec-2】【DesignController:79】

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值