历史潮流浩浩荡荡,顺之则昌,逆之则亡。——孙中山

Java设计模式之静态代理模式

JAVA 徐承恩 1166℃

代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。

简言之,代理模式就是设置一个中间代理来控制访问原目标对象,以达到增强原对象的功能和简化访问方式。

代理模式UML类图

静态代理

静态代理需要代理对象和目标对象实现一样的接口。

优点:

1、可以在不修改目标对象的前提下扩展目标对象的功能。

缺点:

1、冗余。由于代理对象要实现与目标对象一致的接口,会产生过多的代理类。

2、不易维护。一旦接口增加方法,目标对象与代理对象都要进行修改。

静态代理示例代码

AccountDao接口类

package com.github.xuchengen.proxy.statics;

/**
 * 账户表数据访问层接口
 * 作者:徐承恩
 * 邮箱:xuchengen@gmail.com
 * 日期:2020/4/1 2:03 下午
 */
public interface AccountDao {

    /**
     * 保存
     */
    void save();

}

AccountDaoImpl接口实现类

package com.github.xuchengen.proxy.statics;

/**
 * 账户表数据访问层接口实现
 * 作者:徐承恩
 * 邮箱:xuchengen@gmail.com
 * 日期:2020/4/1 2:04 下午
 */
public class AccountDaoImpl implements AccountDao {

    @Override
    public void save() {
        System.out.println("保存账户数据");
    }

}

AccountDaoProxy代理类

package com.github.xuchengen.proxy.statics;

/**
 * 账户表数据访问层代理
 * 作者:徐承恩
 * 邮箱:xuchengen@gmail.com
 * 日期:2020/4/1 2:07 下午
 */
public class AccountDaoProxy implements AccountDao {

    private AccountDao accountDao;

    /**
     * 构造方法
     *
     * @param accountDao 账户表数据访问层接口
     */
    public AccountDaoProxy(AccountDao accountDao) {
        this.accountDao = accountDao;
    }

    @Override
    public void save() {
        try {
            System.out.println("开启事务");
            accountDao.save();
            System.out.println("提交事务");
        } catch (Exception e) {
            System.out.println("事务回滚");
        }
    }
}

StaticProxyTest测试类

package com.github.xuchengen.proxy.statics;

/**
 * 静态代理测试
 * 作者:徐承恩
 * 邮箱:xuchengen@gmail.com
 * 日期:2020/4/1 2:11 下午
 */
public class StaticProxyTest {

    public static void main(String[] args) {

        AccountDao accountDao = new AccountDaoImpl();

        AccountDaoProxy accountDaoProxy = new AccountDaoProxy(accountDao);

        accountDaoProxy.save();

    }

}

控制台输出

开启事务
保存账户数据
提交事务

转载请注明:思码老徐 » Java设计模式之静态代理模式

喜欢 (0)