AOP_代理模式學習_靜態代理
阿新 • • 發佈:2020-08-01
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再理解: