代理模式(不改变业务原有功能)是 Spring AOP 的底层,分为静态代理、动态代理
静态代理:
抽象角色:一般会使用接口或抽象类来解决
真实角色:被代理的角色(房东)
代理角色:代理真实角色,一般会有一些附属操作(租房中介)
客户:访问代理对象的人(你)
写个接口:
接口里写个方法
package com.demo.proxy;
//租房
public interface Rent {
public void rent();
}
真实角色:
实现接口,重写方法
package com.demo.proxy;
//房东
public class Landlord implements Rent{
@Override
public void rent() {
System.out.println("我是房东,快来租房");
}
}
代理角色:
实现接口,重写方法
无参构造,有参构造
package com.demo.proxy;
//代理
public class Proxy implements Rent{
private Landlord landlord;
public Proxy() {
}
public Proxy(Landlord landlord) {
this.landlord = landlord;
}
public void seeHouse(){
System.out.println("中介带你来看房");
}
public void expenses(){
System.out.println("快点交钱");
}
@Override
public void rent() {
landlord.rent();
seeHouse();
expenses();
}
}
客户端访问代理角色:
new 一个真实角色
new 一个代理角色,引入真实角色
调用代理角色的方法
package com.demo.proxy;
//客户
public class Client {
public static void main(String[] args) {
Landlord landlord = new Landlord();
//代理
Proxy proxy = new Proxy(landlord);
proxy.rent();
}
}
执行结果如下:
再举个例子,实现业务分工
抽象角色:接口
package com.demo.proxy;
public interface UserService {
public void add();
public void delete();
public void update();
public void query();
}
真实角色:实现接口
package com.demo.proxy;
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("查");
}
}
代理角色:实现接口,写个 set 方法,通过真实角色去调用方法
package com.demo.proxy;
public class UserServiceProxy implements UserService{
private UserServiceImpl userService;
//set方法
public void setUserService(UserServiceImpl userService) {
this.userService = userService;
}
@Override
public void add() {
log("add");
userService.add();
}
@Override
public void delete() {
log("delete");
userService.delete();
}
@Override
public void update() {
log("update");
userService.update();
}
@Override
public void query() {
log("query");
userService.query();
}
public void log(String msg){
System.out.println("[debug]使用了" + msg + "方法");
}
}
客户端访问代理角色:
new 一个真实角色
new 一个代理角色
通过代理角色去调用 set 方法,引入真实角色
调用代理角色的方法
package com.demo.proxy;
public class UserClient {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
UserServiceProxy userServiceProxy = new UserServiceProxy();
userServiceProxy.setUserService(userService);
userServiceProxy.add();
}
}
执行效果如下: