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();
}
}
来源:https://www.cnblogs.com/yangyanbo/p/12370105.html