IDB package com.bjpowernode.proxy; /** * 代理類和目標類都必須使用同一個介面。 */ public interface IDB { int insert(); int delete(); int update(); } OracleDB package com ...
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(); } }