代理模式分类:
- 静态代理
- 动态代理
1.1 静态代理
静态代理角色分析
- 抽象角色: 一般使用接口或者抽象类来实现。
- 真实角色 : 被代理的角色。
- 代理角色 : 代理真实角色 ; 代理真实角色后 , 一般会做一些附属的操作 。
- 客户 : 使用代理角色来进行一些操作 。
1.2 代码示例
Rent接口(抽象角色)
package cn.guardwhy.domain;
// 抽象角色:租房
public interface Rent {
public void rent();
}
Landlord
package cn.guardwhy.domain;
// 真实角色: 房东,要出租房子
public class Landlord implements Rent {
@Override
public void rent() {
System.out.println("房屋出租!!!");
}
}
Proxy 即代理角色
package cn.guardwhy.proxy;
import cn.guardwhy.domain.Landlord;
import cn.guardwhy.domain.Rent;
public class Proxy implements Rent {
private Landlord landlord;
public Proxy() {
}
public Proxy(Landlord landlord) {
this.landlord = landlord;
}
@Override
// 租房
public void rent() {
// 调用方法
seeHouse();
landlord.rent();
agreement();
fare();
}
// 看房
public void seeHouse(){
System.out.println("带房客看房!!!");
}
// 合同
public void agreement(){
System.out.println("签租赁合同...");
}
// 收中介费
public void fare(){
System.out.println("收中介费");
}
}
Client(租客)
package cn.guardwhy.client;
import cn.guardwhy.domain.Landlord;
import cn.guardwhy.proxy.Proxy;
public class Client {
public static void main(String[] args) {
// 1.房东租房子
Landlord landlord = new Landlord();
// 2.代理,中介帮房东租房子
Proxy proxy = new Proxy(landlord);
// 3.不需要直接面对房东,直接找中介租房即可
proxy.rent();
}
}
执行结果
分析结果
在这个过程中,你直接接触的就是中介,就如同现实生活中的样子,你看不到房东,但是你依旧租到了房东的房子通过代理,这就是所谓的代理模式。
1.3 静态代理特点
优点:
- 可以使得我们的真实角色更加纯粹 . 不再去关注一些公共的事情 。
- 公共的业务由代理来完成 . 实现了业务的分工 。
- 公共业务发生扩展时变得更加集中和方便 。
缺点 :
类多了 , 多了代理类 , 工作量变大了 . 开发效率降低 。
2.1 静态代理再理解
1.抽象角色
package cn.guardwhy.domain;
// 抽象角色,增删改查业务
public interface UserService {
void add();
void delete();
void update();
void query();
}
2、真实对象来完成增删改查操作
package cn.guardwhy.domain;
// 真实对象,完成增删改查的操作
public class UserServiceImpl implements UserService{
@Override
public void add() {
System.out.println("增加了一个用户");
}
@Override
public void delete() {
System.out.println("删除了一个用户");
}
@Override
public void update() {
System.out.println("更新了一个用户");
}
@Override
public void query() {
System.out.println("查询一个用户");
}
}
3、设置一个代理类来处理日志
package cn.guardwhy.proxy;
import cn.guardwhy.domain.UserService;
import cn.guardwhy.domain.UserServiceImpl;
public class UserServiceProxy implements UserService {
private UserServiceImpl userService;
public UserServiceImpl getUserService() {
return userService;
}
public void setUserService(UserServiceImpl userService) {
this.userService = userService;
}
@Override
public void add() {
message("添加方法");
userService.add();
}
@Override
public void delete() {
message("删除方法");
userService.delete();
}
@Override
public void update() {
message("更新方法");
userService.update();
}
@Override
public void query() {
message("查询方法");
userService.query();
}
public void message(String msg){
System.out.println("执行了" + msg + "方法!!");
}
}
4、测试代码
package cn.guardwhy.client;
import cn.guardwhy.domain.UserServiceImpl;
import cn.guardwhy.proxy.UserServiceProxy;
public class Client2 {
public static void main(String[] args) {
// 1.真实业务
UserServiceImpl userService = new UserServiceImpl();
// 2.代理类
UserServiceProxy proxy = new UserServiceProxy();
// 3.使用代理类实现日志功能
proxy.setUserService(userService);
// 调用方法
proxy.add();
}
}