1. 程式人生 > 實用技巧 >AOP_代理模式學習_靜態代理

AOP_代理模式學習_靜態代理

AOP_代理模式學習

代理模式的分類:

  • 靜態代理
  • 動態代理

1、靜態代理

角色分析:

  • 抽象角色:一般會使用介面或抽象類來解決
  • 真實角色:被代理的物件
  • 代理角色:代理真實角色,代理真實角色後,我們一般會做一些附屬操作
  • 客戶:訪問代理角色的人

典例程式碼:

以租房為例

1、建立Rent介面

public interface Rent{
    public void rent();
}

2、Host房東

public class Host implements Rent{
    public void rent(){
        System.out.println("房東要出租房屋!");
    }
} 

3、建立中介類Proxy

public class Proxy implements Rent{
    private Host host;
    
    public Proxy(){
        
    }
    
    public Proxy(Host host){
        this.host = host;
    }
    
    //重寫的方法
    public void Rent(){
        seeHouse();
        host.rent();
        hetong();
        free();
    }
    
    
    //中介的看房
    public void seeHouse(){
        System.out.println("中介帶你去看房!");
    }
    
    //中介收中介費
    public void free(){
        System.out.println("中介收中介費!");
    }
        
    //中介籤租賃合同
    public void hetong(){
        System.out.println("籤租賃合同!");
    }
}

4、客戶租房

public class Client{
    public static void main(String[] args){
        Host host = new Host();
        //代理,中介幫房東租房子,但是中介一般會有一些附屬操作
        Proxy proxy = new Proxy(host);
        proxy.rent();
    }
}

代理模式的好處:

  • 可以使真實角色的操作更加的純粹!不用去關注一些公共的業務
  • 公共業務就交給代理角色,實現了業務的分工
  • 公共業務發生拓展時,方便集中管理

缺點:

  • 一個真實角色就會產生一個代理角色,程式碼量會翻倍,開發效率會變低

靜態代理的加深理解:

在實現增刪改查的基礎上新增日誌功能

1、建立介面Userservice

public interface UserService{
    public void add();
    public void delete();
    public void update();
    public void query();
}

2、建立介面的實現類

//真實物件
public class UserServiceImpl implements UserService{
    public void add(){
        System.out.println("增加了一個使用者!");
    }
    public void delete(){
        System.out.println("刪除了一個使用者!");
    }
    public void update(){
        System.out.println("修改了一個使用者!");
    }
    public void query(){
        System.out.println("查詢了一個使用者!");
    }
}

3、測試客戶端Client

public class Client{
   public static void main(String[] args){
       UserServiceImpl userService = new UserServiceImpl();
       userService.add();
       
   }
}

4、增加代理UserServiceProxy

public class UserServiceProxy implements UserService{
    
    private UserServiceImpl userService;
    
    public void setUserService(UserServiceImpl userService){
        this.userService = userService;
    }
    
    
    public void add(){
        log("add");
        userService.add();
    }
    public void delete(){
        log("delete");
        userService.delete();
    }
    public void update(){
        log("update");
        userService.update();
    }
    public void query(){
        log("query");
        userService.query();
    }
    
    //新增日誌的方法
    public void log(String msg){
        System.out.println("使用了"+msg+"方法");
    }
    
}

5、優化測試類

public class Client{
   public static void main(String[] args){
       UserServiceImpl userService = new UserServiceImpl();
       
       UserServiceProxy userServiceProxy = new UserServiceProxy();
       userServiceProxy.setUserService(userService);
       
       userServiceProxy.add();
   }
}

AOP再理解: