关于桥接模式的理解:
桥接模式,就是为了抽象化和实现化进行解耦,使得这两块可以独立变化。与通过子继承的方式相比,桥接模式,可以避免给系统带来大量的子类。
最基本的设计思路,就是类在不同维度上的变化,一个维度的变化采用一种类或者接口,这满足单一设计原则。
不同维度的变化比较难理解,举一个比较简单的例子:
用铅笔、圆珠笔、钢笔的笔画点、曲线、圆。
这例子就有两个维度的变化,
1,不同的笔:铅笔、圆珠笔、钢
2,不同的图:点、曲线、圆
用桥接模式来设计这个例子,他的uml类图就是这样子的。
再举一个例子
需要调用数据库的select、insert、update等api接口,完成数据库的操作。执行完了需要进行其他的业务操作(比如打开数据库,关闭数据库)。
数据库种类维度的变化:mysql、oracle、sqlServer等
其他的业务操作:打开数据库,关闭数据等
数据库例子的例子源码:
package com.learn.design.bridge;
/**
* Created by liuyingzi on 2018/9/4.
* 定义的桥接接口
*/
public interface SqlOperation {
public void select();
public void insert();
public void update();
}
package com.learn.design.bridge;
/**
* Created by liuyingzi on 2018/9/4.
* 桥接接口的实施类
*/
public class MysqlSqlOperation implements SqlOperation{
@Override
public void select() {
System.out.println("mysql select()");
}
@Override
public void update() {
System.out.println("mysql update()");
}
@Override
public void insert() {
System.out.println("mysql insert()");
}
}
package com.learn.design.bridge;
/**
* Created by liuyingzi on 2018/9/4.
* 桥接接口的实施类
*/
public class OracleSqlOperation implements SqlOperation {
@Override
public void select() {
System.out.println(" Oracle select()");
}
@Override
public void update() {
System.out.println(" Oracle update()");
}
@Override
public void insert() {
System.out.println(" Oracle insert()");
}
}
package com.learn.design.bridge;
/**
* Created by liuyingzi on 2018/9/4.
* 抽象类
*/
public abstract class SqlService {
SqlOperation sqlOperation;
abstract public void open();
abstract public void close();
}
package com.learn.design.bridge;
/**
* Created by liuyingzi on 2018/9/4.
* 抽象类的子类
*/
public class SonSQLService extends SqlService {
@Override
public void close() {
System.out.println(" SonSQLService close()");
}
@Override
public void open() {
System.out.println(" SonSQLService open()");
}
public void select(){
this.sqlOperation.select();
}
public void insert(){
this.sqlOperation.insert();
}
public void update(){
this.sqlOperation.update();
}
}
package com.learn.design.bridge;
/**
* Created by liuyingzi on 2018/9/4.
* 客户端的调用方法
*/
public class Client {
public static void main(String[] args){
SonSQLService sql = new SonSQLService();
sql.sqlOperation = new MysqlSqlOperation();
sql.open();
sql.select();
sql.insert();
sql.update();
sql.close();
sql = new SonSQLService();
sql.sqlOperation = new OracleSqlOperation();
sql.open();
sql.select();
sql.insert();
sql.update();
sql.close();
}
}
运行结果:
通过上面的几个例子,可以得出桥连接通用的uml类图: