静态代理模式

1.静态代理模式,使用数据库连接池为例

代理类,这里只演示了需要使用的方法
代理类需要持有被代理类对象和源对象


/**
 * 代理对象
 */
public class ConnectionProxy implements Connection {

   /**
     * 被代理对象
     */
    private Connection connection;
    /**
     * 源对象
     */
    private SmDataSource smDataSource;
    public ConnectionProxy(Connection connection , SmDataSource smDataSource){
        //需要接收一个被代理对象,还需要接收一个源对象
        this.connection = connection;
        this.smDataSource = smDataSource;
    }
@Override
    public void close() throws SQLException {
        //被代理对象中,需要替换的方法
        //使用源对象中的同名close方法
        smDataSource.back(connection);
    }

数据库连接池类


/**
 * 类描述:维护数据库连接池
 *
 * @ClassName SmDataSource
 * @Description TODO
 * @Author 小鹏
 * @Date 2022/6/2 20:30
 * @Version 1.0
 */
public class SmDataSource {
    //链表集合
    private static LinkedList<Connection> list = new LinkedList<>();
    private String url;
    private String username;
    private String password;
    //连接池大小
    private Integer initSize;
    public SmDataSource(){

    }

    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //创建数据库连接对象,存入linkedlist中
    public void init(){
        for (int i = 0; i < initSize; i++) {
            try {
                Connection connection = DriverManager.getConnection(url, username, password);
                //创建代理对象  传入被代理类connection和源对象,SMDataSource本身调用了初始化方法,这里就传入this
                ConnectionProxy connectionProxy = new ConnectionProxy(connection, this);
                //将代理对象加入链表
                list.add(connectionProxy);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public Connection getConn(){
        //弹出一个数据库连接池对象
        return list.pop();
    }
    /**
     * 需要执行的close方法
     */
    public void back(Connection connection) {
        //需要接收一个待关闭的connection对象
        //将连接对象放入链表尾部
        list.addLast(connection);
    }
  //获取数据库连接池大小
    public int getSize(){
        return list.size();
    }

测试类

/**
 * 类描述:测试静态代理
 *
 * @ClassName TextProxy
 * @Description TODO
 * @Author 小鹏
 * @Date 2022/6/2 20:27
 * @Version 1.0
 */
public class TextProxy {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        SmDataSource smDataSource = new SmDataSource();
        smDataSource.setInitSize(10);
        smDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/704a");
        smDataSource.setUsername("root");
        smDataSource.setPassword("root");
        //执行数据库连接池初始化方法
        smDataSource.init();
        System.out.println("数据库连接池大小:"+smDataSource.getSize());
        //获取数据库连接兑现
        Connection conn = smDataSource.getConn();
        PreparedStatement ps = conn.prepareStatement("select * from sys_user where id = ?");
        ps.setInt(1,1);
        ResultSet resultSet = ps.executeQuery();

        resultSet.next();
        String uname = resultSet.getString("uname");

        System.out.println(uname);
        conn.close();
        System.out.println("数据库连接池大小:"+smDataSource.getSize());

    }
}
posted @ 2022-06-03 11:55  重力体  阅读(46)  评论(0)    收藏  举报