java代理模式 应用实现和辨析

代理模式原理

抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

静态代理

主题接口

public interface Subject {
    public void addUser(String userId, String userName);

    public void modifyUser(String userId, String userName);

    public void delUser(String userId);

    public String findUser(String userId);
}

代理对象

public class proxyUser implements Subject {
    private realUser user;

    public proxyUser(realUser user) {
        this.user = user;
    }

    @Override
    public void addUser(String userId, String userName) {
        user.addUser(userId, userName);
    }

    @Override
    public void modifyUser(String userId, String userName) {
        user.modifyUser(userId, userName);
    }

    @Override
    public void delUser(String userId) {
        user.delUser(userId);
    }

    @Override
    public String findUser(String userId) {
        return user.findUser(userId);
    }
}

真实对象

public class realUser implements Subject {
    private static Map<String, String> map = new HashMap<>();

    @Override
    public void addUser(String userId, String userName) {
        map.put(userId, userName);
        System.out.println("正在添加用户,用户为:" + userId + userName + "……");
        scanMap();
    }

    @Override
    public void modifyUser(String userId, String userName) {
//        map.get(userId);
        Iterator iterator = map.keySet().iterator();
        boolean flag = false;
        while (iterator.hasNext()) {
            String key = (String) iterator.next();
            if (key.equals(userId)) {
                map.put(userId, userName);
                flag = true;
            }
        }
        if (!flag) {
            map.put(userId, userName);
        }
        System.out.println("修改modifyUser,userId=" + userId);
        scanMap();
    }

    @Override
    public void delUser(String userId) {
        System.out.println();
        scanMap();
        Iterator iterator = map.keySet().iterator();
        while (iterator.hasNext()) {
            String key = (String) iterator.next();
            if (key.equals(userId)) {
                iterator.remove();
                /**
                 * iterator.remove();
                 * Iterator 工作在一个独立的线程中,并拥有一个mutex锁。
                 * Iterator被创建后会建立一个指向原来对象的单链索引表,
                 * 当原来的对象数量发生变化时,这个索引表的内容不会同步改变,
                 * 所以当索引指针往后移动的时候就找不到要迭代的对象,
                 * Iterator会抛出java.util.ConcurrentModificationException异常。
                 *
                 * 所以Iterator在工作的时候是不允许被迭代的对象被改变的。
                 * 但可使用Iterator本身的remove()来删除对象,
                 * Iterator.remove()方法会在删除当前迭代对象的同时保持索引的一致性。
                 */
                map.remove(key);
            }
        }

        System.out.println("删除delUser,userId=" + userId);
        scanMap();
    }

    @Override
    public String findUser(String userId) {
        System.out.println("findUser,userId=" + userId);
        return userId;
    }

    public void scanMap() {
        map.forEach((k, v) -> {
            System.out.println("userID:" + k + '\n' + "username:" + v);
        });
    }
}

静态代理是一种非常简单的代理模式,我们还需要了解cglib,动态代理,以及动态代理在SpringAOP中的应用。

进一步学习,可以参考:
java 动态代理实现

java cglib实现

SpringAOP原理和代理模式应用场景代理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值