Java设计模式--过滤器模式

1 Filter Pattern 过滤器模式

目的:使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来;
实现:制定不同的规则来对一组对象进行过滤,然后对过滤结果进行分组。

1.结合多个标准来获得单一标准。

2 实现

代码场景:中国移动有很多营销活动,而这些营销活动的对象是有要求的,有的需要判断在网时长,有的需要有最低套餐要求等;
1.中国移动客户目标角色
2.它不同营销活动的要求过滤器角色

2.1 代码实现

抽象过滤器角色:Filter

public interface Filter {
	public List<Consumer> filtrate(List<Consumer> consumers);
}

具体过滤器角色:赠送移动宽带过滤器

public class BroadbandFilter implements Filter {
	@Override
	public List<Consumer> filtrate(List<Consumer> consumers) {
		List<Consumer> cs = new ArrayList<Consumer>();
		// 手机套餐为138以上 赠送移动宽带100M一年
		for (Consumer c : consumers) {
			if (c.getCombos() >= 138) {
				cs.add(c);
			}
		}
		return cs;
	}
}

具体过滤器角色:赠送流量过滤器

public class FreeFlowFilter implements Filter {

	@Override
	public List<Consumer> filtrate(List<Consumer> consumers) {
		List<Consumer> cs = new ArrayList<Consumer>();
		// 在网年份大于5年 赠送10G移动流量
		for (Consumer c : consumers) {
			if (c.getExistsYears() >= 5) {
				cs.add(c);
			}
		}
		return cs;
	}
}

具体过滤器角色:生日提醒过滤器

public class BirthdayRemindFilter implements Filter {

	@Override
	public List<Consumer> filtrate(List<Consumer> consumers) {
		List<Consumer> cs = new ArrayList<Consumer>();
		// 星级为5星级以上 赠送生日提醒
		for (Consumer c : consumers) {
			if (c.getCombos() >= 138) {
				cs.add(c);
			}
		}
		return cs;
	}
}

2.2 涉及角色

过滤器模式包含如下两个角色:

(1) AbstractFilter(抽象过滤器角色):在客户端可以调用它的方法,在抽象过滤器角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的实现类去,传递给相应的实现类对象处理。
(2) ConcreteFilter(具体滤器角色):在客户端可以调用它的方法,在具体滤器角色会对目标对象集合进行逻辑过滤,最后再返回一个过滤后的集合。
(3) Subject(被过滤角色):在软件系统中可以有一个或者多个目标角色,在具体过滤器中会对目标角色进行逻辑处理以查看是否是我想要的。

2.3 调用

调用者:

public class Client {

	public static void main(String[] args) {
		Consumer zhangft = new Consumer("张奉天", 1, 5, 138);
		Consumer ruiBo = new Consumer("芮博", 5, 2, 238);
		Consumer zhongJj = new Consumer("仲军军", 10, 4, 1);

		List<Consumer> cs = new ArrayList<Consumer>();
		cs.add(zhangft);
		cs.add(ruiBo);
		cs.add(zhongJj);

		Filter broadbandFilter = new BroadbandFilter();
		Filter freeFlowFilter = new FreeFlowFilter();
		Filter birthdayRemindFilter = new BirthdayRemindFilter();

		System.out.println("移动宽带免费一年用户:");
		List<Consumer> broadband = broadbandFilter.filtrate(cs);
		printList(broadband, "移动宽带");
		System.out.println("免费赠送移动流量用户:");
		List<Consumer> freeFlow = freeFlowFilter.filtrate(cs);
		printList(freeFlow, "流量10G");
		System.out.println("赠送生日提醒用户:");
		List<Consumer> birthdayRemind = birthdayRemindFilter.filtrate(cs);
		printList(birthdayRemind, "生日提醒功能");

	}
	private static void printList(List<Consumer> cs, String bussiness) {
		for (Consumer c : cs) {
			System.out.println("[" + c.getStar() + "]星级用户[" + c.getName()
					+ "],在网[" + c.getExistsYears() + "],当前套餐为[" + c.getCombos()
					+ "],免费赠送[" + bussiness + "]");
		}
	}

}

结果:

移动宽带免费一年用户:
[5]星级用户[张奉天],在网[1],当前套餐为[138],免费赠送[移动宽带]
[2]星级用户[芮博],在网[5],当前套餐为[238],免费赠送[移动宽带]
免费赠送移动流量用户:
[2]星级用户[芮博],在网[5],当前套餐为[238],免费赠送[流量10G]
[4]星级用户[仲军军],在网[10],当前套餐为[1],免费赠送[流量10G]
赠送生日提醒用户:
[5]星级用户[张奉天],在网[1],当前套餐为[138],免费赠送[生日提醒功能]
[2]星级用户[芮博],在网[5],当前套餐为[238],免费赠送[生日提醒功能]

Java设计模式汇总:点击跳转
代码地址:点击跳转

参考文献:
[ 1 ] 图解设计模式/(日)结城浩著;杨文轩译。–北京:人民邮电出版社,2017.1.
[ 2 ] 维基百科 设计模式
[ 3 ] 极客学院WIKI–设计模式.
[ 4 ] 菜鸟教程–设计模式.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值