spring-静态代理模式
1 思维导图
2 角色分析
抽象角色 : 一般使用接口或抽象类,由代理角色和真实角色继承或实现,来保证二者具有部分相同的行为
真实角色 : 客户真正要访问的角色,由代理角色进行代理
代理角色 : 相当于是客户和真实角色的中介,访问真实角色后返回给客户,这中间可以添加一些自己的操作
客户 : 访问代理角色
3 代码示例
3.1 示例一
模拟房屋租赁
3.1.1抽象角色
//租房
public interface Rend {
public void rend();
}
3.1.2 真实角色
public class Homeowner implements Rend{
@Override
public void rend(){
System.out.println("房东出租了房子");
}
}
3.1.3 代理角色
public class Proxy implements Rend{
private final Homeowner homeowner;
public Proxy(Homeowner homeowner) {
this.homeowner = homeowner;
}
//租房子
@Override
public void rend(){
seeHouse();
deal();
this.homeowner.rend();
fare();
}
//看房子
public void seeHouse(){
System.out.println("中介带你看房");
}
//签租房协议
public void deal(){
System.out.println("中介带你签合同");
}
//收中介费
public void fare(){
System.out.println("租房成功,中介收中介费");
}
}
3.1.4 客户
public class Client {
public static void main(String[] args) {
Proxy proxy = new Proxy(new Homeowner());
proxy.rend();
}
}
3.1.5 执行结果
3.2 示例二
模拟添加日志
3.2.1 抽象角色
public interface UserService {
public void query();
public void add();
public void delete();
public void update();
}
3.2.2 真实角色
public class UserServiceImpl implements UserService{
@Override
public void query() {
System.out.println("查询用户");
}
@Override
public void add() {
System.out.println("增加用户");
}
@Override
public void delete() {
System.out.println("删除用户");
}
@Override
public void update() {
System.out.println("修改用户");
}
}
3.3.3 代理角色
public class UserServicePoxy implements UserService{
private UserServiceImpl userService;
public void setUserService(UserServiceImpl userService) {
this.userService = userService;
}
@Override
public void query() {
log("query");
userService.query();
}
@Override
public void add() {
log("add");
userService.add();
}
@Override
public void delete() {
log("delete");
userService.delete();
}
@Override
public void update() {
log("update");
userService.update();
}
//日志方法
private void log(String msg){
System.out.println("[DeBug]使用了"+msg+"方法");
}
}
3.3.4 客户
public class Client {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
UserServicePoxy userServicePoxy = new UserServicePoxy();
userServicePoxy.setUserService(userService);
userServicePoxy.add();
userServicePoxy.delete();
userServicePoxy.query();
userServicePoxy.update();
}
}
3.3.5 执行结果
4 总结
4 .1 优点
- 可以使得我们的真实角色更加纯粹 . 不再去关注一些公共业务 .
- 公共业务由代理来完成 . 实现了业务的分工 ,
- 公共业务发生扩展时变得更加集中和方便 .
4.2 缺点 :
- 类多了 , 多了代理类 , 工作量变大了 . 开发效率降低 .
4.3 核心: 在不改变原有代码的基础上,对功能进行了扩充