设计模式
自定义数据库连接池
概述
java.sql.DataSource 接口: 数据源(数据库连接池) java官方提供的数据库连接池规范(接口)
//1. 实现DataSource接口.(这是JDBC定义的规范)
public class DataS implements DataSource {
//2. 用集合来存储连接(Connection) .List<> 集合
private List<Connection> DataS;
public DataS() {
DataS = new ArrayList<>();
for (int i = 0; i < 10; i++) { DataS.add(JDBCUtils.getConnection());
}
}
public int getSize() {
return DataS.size();
}
@Override
public Connection getConnection() throws SQLException {
Connection con = null;
if (DataS.size() > 0) {
con = DataS.get(0);
DataS.remove(con);
}
return con;
}
/*归还连接的方式:
继承
装饰者模式
适配器模式
动态代理模式
*/
装饰者模式
必须实现相同的接口
装饰类必须传入被装饰类的对象
需要增强方法则对其拓展
不需要拓展则字节调用原方法`
/*
作用: 在不改变原有类本质和基础功能的情况下增强原有类的功能
原有类A
LoginA 装饰者类
装饰本质:
装饰后本质不改变
如果被装饰者有功能实现,那么自己可以直接调用装饰者的功能,自己只需做其他加上的功能
*/
//KTV 类
public interface KTV {
void sing();
}
// 实现类1 只有基础的唱歌功能
public class heimaKTV implements KTV {
@Override
public void sing() {
System.out.println("唱歌功能");
}
}
// 实现类2 加上了 灯光效果
public class ligthKTV implements KTV {
private KTV ktv;
public ligthKTV(KTV ktv) {
this.ktv = ktv;
}
@Override
public void sing() {
ktv.sing();
System.out.println("加上灯光效果");
}
}
//实现类3 有了休息室
public class ServiceKTV implements KTV {
private KTV ktv;
public ServiceKTV(KTV ktv) {
this.ktv = ktv;
}
@Override
public void sing() {
ktv.sing();
System.out.println("加上休息室");
}
}
//测试类:
public class Text {
public static void main(String[] args) {
KTV ktv = new heimaKTV();
KTV ktv1 = new ligthKTV(ktv);
KTV ktv2 = new ServiceKTV(ktv1);
ktv2.sing();
}
}
/**
打印结果:
唱歌功能
加上灯光效果
加上休息室
*/
适配器模式
/*
对象:
目标接口(想要的类型)
已存在的接口
适配(实现目标接口,继承已有实现)
被继承的类,已经重写了需要改变目标接口的方法,适配器可以直接调用父类的该方法.
目标:
已有sports接口.(这是目标类型),目前系统已有SportsEx
*/
//代码实现
// 定义一个已知接口
public interface Sports {
void sport();
}
//定义一个类,作为父类,用来被适配器继承
public class Exercise {
public void exercise() {
System.out.println("正在运动");
}
}
// 定义一个适配器.继承Exercise类,实现Sports接口
public class Aupadter extends Exercise implements Sports {
@Override
public void sport() {
exercise();
}
}
//定义一个类.使用被重写后的已知接口的方法,
public class Person {
private Sports sport;
public Person(Sports sport) {
this.sport = sport;
}
public void setSport() {
sport.sport();
}
}
//测试
public class Text {
public static void main(String[] args) {
Person p = new Person(new Aupadter());
p.setSport();
}
}
//打印结果:正在运动