• 代理模式-静态代理


    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();
            
        }
    
    }
  • 相关阅读:
    Selenium学习:选择元素的几种方法
    Selenium学习:find_element_by_xpath()的几种方法
    Selenium 循环删除页面元素
    Java 基础(main方法介绍)
    Java 基础(单例 Singleton 设计模式)
    Java 练习(static 关键字)
    Java 基础(static 关键字)
    Java 练习(包装类 Wrapper )
    Java 基础(包装类 Wrapper 的使用)
    Java 练习(Object 练习二)
  • 原文地址:https://www.cnblogs.com/yangyanbo/p/12370105.html
Copyright © 2020-2023  润新知