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 核心: 在不改变原有代码的基础上,对功能进行了扩充

posted @ 2022-01-17 15:16  从0开始丿  阅读(62)  评论(0编辑  收藏  举报