设计模式(二):代理模式(上)-静态代理(StaticProxy)

star2017 1年前 ⋅ 215 阅读

静态代理在使用时,需要定义接口或者父类,目标对象与代理对象一起实现相同的接口或者是继承相同父类

代理对象通过调用代理对象的方法来调用目标对象的方法;可以在不修改目标对象的前提下,对目标对象的功能进行扩展。

静态代理

  1. 静态代理实现核心:
    在代理类里,定义一个目标对象的参数;在调用代理对象时,将目标对象做为代理对象构造方法里的参数传入,这样就可以在代理对象的方法里调用目标对象的方法,可以在代理方法里做一些扩展。在调用时,只需通过代理对象调用自身的方法即可。

  2. 构成元素:

    • 接口 或 父类
    • 接口的实现类 或 继承父类的子类
    • 实现同样接口的代理类 或 同样继承父类的代理类

实现接口方式

  1. 接口
/**
 * 接口
 */
public interface UserDao {

    void save();
}
  1. 目标对象类(接口实现类)
/**
 * 目标对象
 *
 */
public class UserDaoImpl implements UserDao {

    @Override
    public void save() {
        System.out.println("正在保存");
    }
}
  1. 代理对象类(实现同一个接口)
/**
 * 代理对象
 *
 */
public class UserDaoProxyImpl implements UserDao {

    private UserDaoImpl userDaoImpl;
    public UserDaoProxyImpl(UserDaoImpl userDaoImpl) {
        this.userDaoImpl = userDaoImpl;
    }

    @Override
    public void save() {
        System.out.println("代理增强:  开始保存。。。。");
        userDaoImpl.save();
        System.out.println("代理增强:  保存结束。。。。");
    }
}
  1. 调用代理类
public class ProxyMain {

    public static void main(String[] args) {
        UserDaoImpl userDaoImpl = new UserDaoImpl();
        UserDaoProxyImpl userDaoProxyImpl = new UserDaoProxyImpl(userDaoImpl);
        userDaoProxyImpl.save();
    }
}
  1. 执行结果
代理增强:  开始保存。。。。
正在保存
代理增强:  保存结束。。。。

继承父类方式

  1. 父类
public class BaseDao {

    public void save() {
        System.out.println("正在保存。。。。");
    }
}
  1. 目标对象类(继承父类)
/**
 * 目标对象类
 *
 */
public class UserDao extends BaseDao {

    public void update() {
        System.out.println("正在更新。。。。");
    }
}
  1. 代理对象类(继承相同的父类)
/**
 * 代理对象
 * @author Rocky
 *
 */
public class UserDaoProxy extends BaseDao {

    private UserDao userDao;
    public UserDaoProxy(UserDao userDao) {
        this.userDao = userDao;
    }

    public void save() {
        System.out.println("代理增强:  开始保存。。。。");
        userDao.save();
        System.out.println("代理增强:  保存结束。。。。");
    }

    public void update() {
        System.out.println("代理增强:  开始更新。。。。");
        userDao.update();
        System.out.println("代理增强:  更新结束。。。。");
    }
}
  1. 调用代理对象
public class ProxyMain {

    public static void main(String[] args) {
        UserDao userDaoImpl = new UserDao();
        UserDaoProxy userDaoProxy = new UserDaoProxy(userDaoImpl);
        userDaoProxy.save();
        System.out.println("------------------------------------");
        userDaoProxy.update();
    }
}
  1. 执行结果
代理增强:  开始保存。。。。
正在保存。。。。
代理增强:  保存结束。。。。
------------------------------------
代理增强:  开始更新。。。。
正在更新。。。。
代理增强:  更新结束。。。。

静态代理弊端

代理对象要与目标对象实现一样的接口,或继承同一个父类,若目标类很多的话,就要生成同样多的代理类;一旦接口或父类增加方法,目标对象和代理对象都要维护。

解决静态代理的弊端详见动态代理

更多内容请访问:IT源点

相关文章推荐
  • 该目录下还没有内容!

全部评论: 0

    我有话说: