实际项目运用之Filter模式(过滤器模式)

1 模式简介 1.1 定义 过滤器模式(Filter)也叫条件模式(Criteria),这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。当我们想要选择满足一个或多个条件的对象子集时,此设计模式非常有用。它属于结构模式。 1.2 优点 它提供了一种根据特定条件过滤对象的方法 我们可以随时添加新过滤器,而不会影响客户端的代码 我们可以在程序执行期间动态选择过滤器 1.3 过滤器设计 角色 过滤器(Filter) - 过滤器在请求处理程序执行请求之前或之后,执行某些任务 过滤器链(Filter Chain) - 过滤器链带有多个过滤器 过滤对象 (Target)- 需要过滤的数据源对象 过滤管理器(Filter Manager) - 过滤管理器管理过滤器和过滤器链 客户端(Client) - Client 是向 Target 对象发送请求的对象 代码演示 Filter public interface Filter { public void execute(String request); } AuthenticationFilter public class AuthenticationFilter implements Filter { public void execute(String request){ System.out.println("Authenticating request: " + request); } } FilterChain

实际项目运用之Adapter模式(适配器模式)

1. 模式简介 适配器模式解决的问题:让原本因为接口不兼容而不能一起工作的类可以一起工作 适配器模式中有三种角色: 目标接口Target:用户期望的类,可以是接口,也可以是抽象类或具体类; 需要适配的类Adaptee:当前系统中有的类; 适配器Adapter:在现有接口和目标接口之间的“适配者” 适配器模式的优点: 通过适配器模式,用户在做相似的操作时可以调用同一个接口,其内部过程对于用户是透明的,这样做更简单、更直接、更解耦; 复用了现存的类,解决了现存类和复用环境要求不一致的问题; 将目标接口和现有接口解耦,通过引入一个适配器类,而无需修改原有的代码。 适配器模式的缺点: 使用适配器模式后,如果想要改变适配对象,就需要更换适配器,而更换适配器是一个非常复杂的过程。 适配器模式的适用场景: > 当系统需要使用现有的类,而现有的类不符合系统的接口 当期望的功能和系统中现有的某个类的功能相似,但是具有不同的接口 当系统已经实现某功能,但用户想通过另种接口方式访问,而不想修改原有接口 当使用的第三方组件的接口和系统中定义好的接口不同,不希望修改系统接口 2.案例代码 适配器分类_适配器模式_和对象适配器模式 2.1 类适配器UML 2.2 对象适配器模式UML 2.3 案例代码: 被适配对象 public class Adaptee { public void adapteeMethod() { System.out.println("这是我们已经实现的功能!"); } } 对象适配器 public class Adapter implements Target { private Adaptee adaptee = new Adaptee(); @Override public void targetMethod() { adaptee.adapteeMethod(); } } 目标接口

实际项目运用之Decorator模式(装饰器模式)

1 概述 在项目中,经常因一些新增需求,导致同一业务的变更,如果所在类继承关系如下:Parent、Child、Grandparent,那么要在Child类上增强些功能怎么办?给Child类增加方法?那会对Grandparent产生什么影响?该如何去处理?看完本文,你会找到你的答案。 JavaIO中,像下面的嵌套语句很常见,为什么要怎样定义呢?理解装饰模式后,你会找到答案。 FilterInputStream filterInputStreasm = new BufferedInputStream(new FileInputStream(new File("/user/a"))); 1.1案例 例如下面一个功能需求,4s店的汽车销售向客户推销自家品牌的产品,我们用代码实现,关系如下: 具体代码: 汽车销售类 public abstract class CarSale { /** * 推销车的详情 */ public abstract void displayCarInfo(); /** * 客户签订购买合同 */ public abstract void signContract(String customerName); } 汽车参数详情 public class CarInfo extends CarSale { @Override public void displayCarInfo() { System.out.println("日本丰田GTR"); System.out.println("百公里加速1秒"); System.out.println("油耗偏高"); System.out.println("后驱涡轮增压"); System.out.println("内饰豪华"); System.out.println("发动机噪音偏大"); System.out.println("不支持电动座椅,后视镜加热"); } @Override public void signContract(String customerName) { System.out.println("客户签约销售合同, 付款人:" + customerName); } } 客户