------- android培訓、java培訓、期待與您交流! ----------
代理模式是常用的java設計模式,他的特徵是代理類與委託類有同樣的接口,代理類主要負責爲委託類預處理消息、過濾消息、把消息轉發給委託類,以及事後處理消息等。代理類與委託類之間通常會存在關聯關係,一個代理類的對象與一個委託類的對象關聯,代理類的對象本身並不真正實現服務,而是通過調用委託類的對象的相關方法,來提供特定的服務。
按照代理的創建時期,代理類可以分爲兩種。
靜態代理:由程序員創建或特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了。
動態代理:在程序運行時,運用反射機制動態創建而成。
需求:
1、使用靜態代理模式,對數據庫中的數據進行增刪改查操作
2、對每一個操作,都需要對其進行日誌記錄
那麼我們先以靜態代理進行示例展示
1、接口StaticProxy_Interface
package com.proxy.static_proxy;
/*
* 演示靜態代理類
*
* 功能:定義一個接口,用於對數據庫進行操作
*
* @author lijl
* */
public interface StaticProxy_Interface {
//插入
public void Insert();
//刪除
public void Delete();
//修改
public void Update();
//查詢
public void Select();
}
2、StaticProxy_Impl 委託類
package com.proxy.static_proxy;
/*
* 演示靜態代理類
*
* 功能:業務邏輯類,即委託類
* 本類實現StaticProxy_Interface接口,對數據庫的模擬增刪改查功能
*
* @author lijl
* */
public class StaticProxy_Impl implements StaticProxy_Interface {
@Override
public void Insert() {
// TODO Auto-generated method stub
System.out.println("StaticProxy_Impl.Insert()...........");
}
@Override
public void Delete() {
// TODO Auto-generated method stub
System.out.println("StaticProxy_Impl.Delete()...........");
}
@Override
public void Update() {
// TODO Auto-generated method stub
System.out.println("StaticProxy_Impl.Update()...........");
}
@Override
public void Select() {
// TODO Auto-generated method stub
System.out.println("StaticProxy_Impl.Select()...........");
}
}
package com.proxy.static_proxy;
/*
* 演示靜態代理類
*
* 功能:靜態代理類
* 本類實現StaticProxy_Interface接口,對數據庫的每一個操作,都需要留下日誌痕跡
*
* @author lijl
* */
public class StaticProxy implements StaticProxy_Interface {
//由於需要對數據庫的增刪改查等操作留下日誌,那麼需要傳遞進來對數據庫進行操作的業務邏輯類,即委託類對象staticproxy_impl
private StaticProxy_Impl staticproxy_impl;
public StaticProxy(StaticProxy_Impl staticproxy_impl){
this.staticproxy_impl = staticproxy_impl;
}
@Override
public void Insert() {
// TODO Auto-generated method stub
System.out.println("StaticProxy.Insert()..begin..");
staticproxy_impl.Insert();//對插入數據庫操作,前後加入begin end 日誌
System.out.println("StaticProxy.Insert()..end..");
}
@Override
public void Delete() {
// TODO Auto-generated method stub
System.out.println("StaticProxy.Delete()..begin..");
staticproxy_impl.Delete();//對刪除數據庫操作,前後加入begin end 日誌
System.out.println("StaticProxy.Delete()..end..");
}
@Override
public void Update() {
// TODO Auto-generated method stub
System.out.println("StaticProxy.Update()..begin..");
staticproxy_impl.Update();//對更新數據庫操作,前後加入begin end 日誌
System.out.println("StaticProxy.Update()..end..");
}
@Override
public void Select() {
// TODO Auto-generated method stub
System.out.println("StaticProxy.Select()..begin..");
staticproxy_impl.Select();//對查詢數據庫操作,前後加入begin end 日誌
System.out.println("StaticProxy.Select()..end..");
}
}
4、
package com.proxy.static_proxy;
/*
* 演示靜態代理類
*
* 功能:主函數,執行靜態代理類(執行委託類並且帶日誌功能)
*
* 1、創建委託類(業務邏輯類)對象
* 2、創建靜態代理類對象,將委託類對象作爲參數,傳遞到StaticProxy構造方法中
*
* @author lijl
* */
public class StaticProxy_main {
public static void main(String[] args) {
// TODO Auto-generated method stub
StaticProxy_Impl spi = new StaticProxy_Impl();
StaticProxy sp = new StaticProxy(spi);
sp.Insert();
sp.Select();
sp.Update();
sp.Delete();
}
}
總結:從以上例子中就可以看出靜態代理類的功能,
這裏舉一個比較形象的例子,比如有三個對象:思科服務器生產商、服務器代理商、用戶
1、用戶想要去買思科服務器,當然也需要售後的保障(思科服務器好比StaticProxy_Interface接口類)
2、用戶最終要的結果是:買,那麼買,那麼以面向對象的思維看待StaticProxy_Interface接口,實際上就是StaticProxy_Interface接口需要有被人買的動作,那麼這個接口就需要定義買的動作, 即本例中的增刪改查
3、那麼思科服務器,從哪裏來呢?首先思科服務器是由生產商生產的,那麼肯定生產商要去實現StaticProxy_Interface接口,重寫裏面的方法,買的動作,即StaticProxy_Impl。
4、由於思科生產商,自己不去單獨賣服務器,需要去委託給代理商外賣,即將服務器交給代理商,而且代理商要給用戶提供售後的服務,在本例中就是StaticProxy代理類,StaticProxy代理類中需要有StaticProxy_Impl生產商給的服務器對象即設計StaticProxy時,構造方法需要傳遞服務器StaticProxy_Impl並且對思科服務器的每一個產品,進行售後服務,即代理類StaticProxy中的增刪改方法中需要有日誌功能
5、當用戶去買服務器的時候,即main函數,去代理商StaticProxy這裏買,前提供貨商StaticProxy_Impl需要把服務器交給代理商StaticProxy
-------android培訓、JAVA培訓、期待與您交流! ----------
--------詳細請查看www.itheima.com-------------