过滤器模式 - Filter Pattern
定义
这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。
过滤器模式也叫条件模式,过滤器模式是责任链模式的一种衍生模式,属于结构型设计模式。
设计的原则和思想
- 解耦的是请求发送对象(触发业务的对象)和请求处理对象(处理业务的对象)。
- 不变部分是请求处理对象,变化部分是请求处理对象之间的关系。
- 核心思想是通过逻辑运算的方式筛选数据。
一句话概括设计模式
过滤条件的复用和组合。
结构中包含的角色
- 抽象过滤器 BaseFilter
- 具体过滤器 ConcreteFilter
- 请求对象 Request
最小可表达代码
interface BaseFilter | |
{ | |
public function filter(Request $request); | |
} | |
class ConcreteFilter implements BaseFilter | |
{ | |
public function filter(Request $request) | |
{ | |
echo '过滤信息'; | |
} | |
} | |
class Request{} | |
// 输出 | |
$request = new Request(); | |
foreach ([ | |
new ConcreteFilter, | |
new ConcreteFilter, | |
] as $filter) { | |
$filter->filter($request); | |
} |
优点
- 多过滤器简单合成。
- 支持并行操作。
- 通过动态选择过滤器组合。
- 简化了对象。使得对象不需要知道链的结构。
- 增加新的请求处理类很方便。
缺点
- 性能下降,实现复杂。
- 不能保证请求一定被接收。
- 系统性能将受到一定影响。
- 代码调试时不太方便,可能会造成循环调用。
何时使用
- 筛选数据的时候。
实际应用场景
- 消息过滤
- 日志过滤。
- mongodb中的Criteria
- 垃圾分类。
- 商城计算用户信用分。根据一大堆条件进行计算。
- 手机卡能否参与某个充值活动。