Class.forName() 的时候,通过反射机制,将 .class 文件加载进Java虚拟机内存中,Driver 类初始化,执行以下代码,向 DriverManager 中注册一个驱动。DriverManager是个 Driver 容器,管理不同的 Driver
static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } }
我们获取连接时,DriverManager 就会根据驱动返回一个相应的数据库连接
@CallerSensitive public static Connection getConnection(String url, java.util.Properties info) throws SQLException { return (getConnection(url, info, Reflection.getCallerClass())); } 实际应用场景对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
银行转账系统
转账分类:网上转账,柜台转账,AMT 转账
转账用户类型:普通用户,银卡用户,金卡用户...
消息管理
消息类型:即时消息,延时消息
消息分类:手机短信,邮件消息,QQ 消息...
三、组合模式(Composite) 基本介绍1、组合模式(Composite Pattern)又叫部分整体模式,他创建了对象组的树形结构,将对象组合成树状结构以表示「整体 - 部分」的层次关系。
2、组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象
模式结构Component(抽象构件):定义参加组合对象的公有方法和属性,可以定义一些默认的行为和属性。
Composite(容器构件):树枝对象,它的作用是组合树枝结点和叶子结点形成一个树形结构。
Leaf(叶子构件):叶子构件的下面没有其他分支,也就是遍历的最小单位。
组合模式有两种实现:安全模式和透明模式,其结构如下图所示
安全组合模式:在抽象构件角色中没有声明任何用于管理成员对象的方法,而是在容器构件 Composite 类中声明并实现这些方法。
透明组合模式:抽象构建角色中声明了所有用于管理成员对象的方法,对其它构件公开透明。
简单案例要求:在页面展示出公司的部门组成(一个公司有多个部门,每个部门有多个小组);
这是一种很明显的树形结构,因此可以用组合模式解决
「抽象构件」:OrganizationComponent
public abstract class OrganizationComponent { private String name; public OrganizationComponent(String name) { this.name = name; } protected void add(OrganizationComponent component) { throw new UnsupportedOperationException("不支持添加操作"); } protected void remove(OrganizationComponent component) { throw new UnsupportedOperationException("不支持删除操作"); } protected abstract void print(); public String getName() { return name; } public void setName(String name) { this.name = name; } }「容器构件」:Company、Department
public class Company extends OrganizationComponent { private List<OrganizationComponent> components = new ArrayList<>(); public Company(String name) { super(name); } @Override protected void add(OrganizationComponent component) { components.add(component); } @Override protected void remove(OrganizationComponent component) { components.remove(component); } @Override protected void print() { System.out.println("======="+getName()+"======="); for (OrganizationComponent component : components) { component.print(); } } @Override public String getName() { return super.getName(); } } public class Department extends OrganizationComponent { private List<OrganizationComponent> components = new ArrayList<>(); public Department(String name) { super(name); } @Override protected void add(OrganizationComponent component) { components.add(component); } @Override protected void remove(OrganizationComponent component) { components.remove(component); } @Override protected void print() { System.out.println("======="+getName()+"======="); for (OrganizationComponent component : components) { component.print(); } } @Override public String getName() { return super.getName(); } }