代理模式-静态代理

点点圈 提交于 2020-02-27 01:57:19
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();
        
    }

}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!