代理模式-静态代理
IDB
package com.bjpowernode.proxy; /** * 代理类和目标类都必须使用同一个接口。 */ public interface IDB { int insert(); int delete(); int update(); }
OracleDB
package com.bjpowernode.proxy; /** * 这是一个Oracle数据库相关的操作类 * * 目标类(委托类)。 */ public class OracleDB implements IDB{ /* * 以下程序编写结束了,并且上线了,客户提出了新的需求, * 这个新的需求就是希望在每一个业务执行的时候都要记录 * 以下所耗费的时间。 * * 客户提出新的需求我们必须满足。但是用下面这种方式进行升级: * 1、违背了OCP原则,开闭原则 * 2、代码没有得到重复利用,因为这些记录方法执行的耗费时长和业务没有关系,都是固定的,在每一个类中都有。 */ /* public int insert(){ long begin = System.currentTimeMillis(); //以下是一个插入操作 System.out.println("Oracle insert data...."); try { Thread.sleep(526); } catch (InterruptedException e) { e.printStackTrace(); } long end = System.currentTimeMillis(); System.out.println("insert方法执行耗费时长:" + (end-begin) + "毫秒"); return 0; } public int delete(){ long begin = System.currentTimeMillis(); //以下是一个删除操作 System.out.println("Oracle delete data...."); try { Thread.sleep(569); } catch (InterruptedException e) { e.printStackTrace(); } long end = System.currentTimeMillis(); System.out.println("delete方法执行耗费时长:" + (end-begin) + "毫秒"); return 0; } public int update(){ long begin = System.currentTimeMillis(); //以下是一个更新操作 System.out.println("Oracle update data...."); try { Thread.sleep(456); } catch (InterruptedException e) { e.printStackTrace(); } long end = System.currentTimeMillis(); System.out.println("update方法执行耗费时长:" + (end-begin) + "毫秒"); return 0; } */ /* * * 为了满足开闭原则,对扩展开发,对修改关闭。 * 引入代理模式:静态代理。 */ public int insert(){ //以下是一个插入操作 System.out.println("Oracle insert data...."); try { Thread.sleep(526); } catch (InterruptedException e) { e.printStackTrace(); } return 0; } public int delete(){ //以下是一个删除操作 System.out.println("Oracle delete data...."); try { Thread.sleep(569); } catch (InterruptedException e) { e.printStackTrace(); } return 0; } public int update(){ //以下是一个更新操作 System.out.println("Oracle update data...."); try { Thread.sleep(456); } catch (InterruptedException e) { e.printStackTrace(); } return 0; } }
DBProxy
package com.bjpowernode.proxy; /** * 代理类 * * 当前的这个代理模式我们称作静态代理模式,分析静态代理模式的缺陷是什么? * * 1、静态代理模式只能代理某一种抽象的类型,而项目开发中我们的抽象类型会很多,加入程序中有100个接口,我们需要编写100个代理类。 * 静态代理模式代理的范围有点窄。不够宽泛。 * * 2、静态代理模式中的代理类中方法中的代码没有得到重复利用。如果目标对象中添加了一个方法,我们代理类中就要相应的添加一个方法。 * 这样又违背OCP原则。 * * 静态代理模式中涉及的角色: * 代理类。 * 目标类。 * 代理类和目标类公共接口。 */ public class DBProxy implements IDB{ //代理对象中有一个目标对象的引用。 private IDB db; public DBProxy(IDB db){ this.db = db; } @Override public int delete() { long begin = System.currentTimeMillis(); //通过代理对象去执行目标对象中的方法。 int exeResult = db.delete(); long end = System.currentTimeMillis(); System.out.println("执行耗费了" + (end-begin) + "毫秒"); return exeResult; } @Override public int insert() { long begin = System.currentTimeMillis(); //通过代理对象去执行目标对象中的方法。 int exeResult = db.insert(); long end = System.currentTimeMillis(); System.out.println("执行耗费了" + (end-begin) + "毫秒"); return exeResult; } @Override public int update() { long begin = System.currentTimeMillis(); //通过代理对象去执行目标对象中的方法。 int exeResult = db.update(); long end = System.currentTimeMillis(); System.out.println("执行耗费了" + (end-begin) + "毫秒"); return exeResult; } }
Test
package com.bjpowernode.proxy; /** * 1、 代理模式主要解决的问题是: * 对目标对象进行低耦合“功能扩展”已经“控制”。 * 代理对象会对目标对象进行控制,例如:代理公司找房子,不但要找房子,而且还影响了了“租户”,要求租户在原租金的基础之上添加中介费。 * * 2、装饰者设计模式主要解决的问题是: * 对被装饰者对象进行低耦合的功能扩展。没有修改操作,装饰者不会控制被装饰者。 */ public class Test { public static void main(String[] args) { //创建目标对象 IDB db = new OracleDB(); //不要直接去执行目标对象 //我们应该通过我们的代理对象去调用目标对象。 //客户端程序面向的是代理对象调用。 IDB dbProxy = new DBProxy(db); //调用代理对象的代理方法 dbProxy.delete(); dbProxy.insert(); dbProxy.update(); } }