jdbc_dbcp连接池和装饰者模式概述

package cn.code.demo;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbcp2.BasicDataSource;
import org.junit.Test;

/*
 * 数据库连接池
 * 池参数:
 * 初始化大小:10个
 * 最小空闲连接数:3个
 * 增量:一次创建的最小单位  5个
 * 最大空闲连接数 12个
 * 最大连接数 20个
 * 最大等待时间:1000毫秒
 * 连接池也是用四大连接参数
 * 实现的接口
 * javax.sql.DataSource接口!
 * */
public class DBCPDemo1 {
    @Test
    public void fun1(){
        /*
         * 1.创建连接池对象
         * 2.配置四大参数
         * 3.配置池参数
         * 4.得到连接对象
         * */
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydb1");
        dataSource.setUsername("root");
        dataSource.setPassword("123");
        
        dataSource.setMaxTotal(20);
        dataSource.setMaxWaitMillis(1000);
        dataSource.setMaxIdle(3);
        
        Connection con =null;
        try {
            con = dataSource.getConnection();
            System.out.println(con.getClass().getName());
            /*
             * 连接池内部使用四大参数创建了链接对象,即mysql驱动提供的Connection
             * 连接池使用mysql的链接对象进行了装饰,只对close()方法进行了增强
             * 装饰之后的Connection close()方法,用来把当前链接归还给池(装饰者设计模式)
             * */
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally{
            try {
                con.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
装饰者模式:
对象增强的手段
*继承
*装饰者模式
*动态代理
被增强的对象可以切换
增强内容可以切换
---------------------
继承:
缺点:
1、增强的内容是死的,不能动
2、被增强的对象也是死的
使用继承回事类增多;
class 咖啡类{}
class 有糖咖啡 extends 咖啡{}
class 加奶咖啡 extends 咖啡{}
class 加盐咖啡 extends 咖啡{}
class 加糖加奶 extends 加奶{}
-------------------------------
装饰者模式:
1、增强的内容是死的
2、被增强的对象时任意的
class 咖啡类{}
class 有糖咖啡 extends 咖啡{}
class 加奶咖啡 extends 咖啡{}
class 加盐咖啡 extends 咖啡{}
咖啡a = new 加糖();
咖啡 b = new 加盐(a);//对a进行装饰,就是给a加盐
咖啡 c = new 加奶(b);
java io流中大量应用!、
四大家族:
1、字节:inputStream outputStream
2、字符:reader、writer
InputStream 
FileInputStream:他是一个节点流,就是和一个资源绑定在一起的!文件
BufferedInputStream : 他是装饰流,创建时必须给一个底层对象,然后我不管你给我的是什么流,我都会给你它添加缓冲区!
new BuferedInputStream(new FileInputStream("c:/xxx.txt"));
ObjectInputStream(new BuferedInputStream(new FileInputStream("c:/xxx.txt")););
ByteArrayInputStream(byte[] buf);
GZIPIputStream();
--------------------
装饰用途:不知道被增强对象的具体类型时,可以使用!
1、是你还有你,一切拜托你!
class MyConnection implements Connection{
    private Connection con;
    public MyConnection(Connection con ){//通过构造器传递底层对象
        this.con=con;
    }
    //一切拜托你
    public Statement createStatement(){
        return con.createStatement();
    }
    //增强方法
    public void close(){
        把当前链接归还给池!
    }
}
Connection con = 通过四大参数创建链接对象由mysql提供
Connection con1 = new MyConnection(con);
con1.close();
原文地址:https://www.cnblogs.com/wangyinxu/p/7428213.html