设计模式-桥接模式及使用场景

什么是桥接模式

桥接模式是一种结构型设计模式,它将一个大类或一系列紧密相关的类拆分成抽象和实现两个独立的层次结构,使它们可以分别变化。桥接模式通过将抽象部分与实现部分分离,可以使它们可以独立地扩展和变化。

使用场景

如果一个系统需要在构建的抽象化角色和具体角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系,抽象化角色和实现化角色可以独立扩展而互不影响,在程序运行时可以动态的组合。
一个类存在两个维度的变化,且这两个维度都需要进行扩展

案例

使用桥接模式将数据库选择的功能抽象出来,也就是上面说的抽象化角色(DB),DB和Repository之间有更多的灵活性,可以自由选择、独立扩展、互不影响,在程序运行时可以动态组合。
DB:包含IDbConnection,子类目前有MysqlDB、SqlServerDB,还可以扩展其他数据库DB

客户端:

            IDB orderDB = new MysqlDB("server=.;~~~~~~~");
            Order_masterRepository orderRepository = new Order_masterRepository(orderDB);
            var orderList = orderRepository.Select("SELECT * FROM Order_master");//从Mysql版的Order数据库查找订单


            IDB productDB = new SqlServerDB("server=.;~~~~~~~");
            ProductRepository productRepository = new ProductRepository(productDB);
            var productList = productRepository.Select("SELECT * FROM Product");//从Sqlserver版的Product数据库查找产品

Model:

    public class Order_master
    {
        public int ID { get; set; }
        public decimal TotalPrice { get; set; }
    }
    public class Product
    {
        public int ID { get; set; }
        public string Title { get; set; }
    }

DB:

    public interface IDB
    {
        IDbConnection GetConnection();
    }
    public class MysqlDB : IDB
    {
        private string _connStr = null;
        public MysqlDB(string connStr)
        {
            _connStr = connStr;
        }
        public IDbConnection GetConnection()
        {
            return new MySqlConnection(_connStr);
        }
    }
    public class SqlServerDB : IDB
    {
        private string _connStr = null;
        public SqlServerDB(string connStr)
        {
            _connStr = connStr;
        }
        public IDbConnection GetConnection()
        {
            return new SqlConnection(_connStr);
        }
    }

Repository:

    public interface IRepository<T>
    {
        IEnumerable<T> Select(string sql);
    }
    public class Order_masterRepository : IRepository<Order_master>
    {
        private IDbConnection _connection = null;
        public Order_masterRepository(IDB db)
        {
            _connection = db.GetConnection();
        }
        public IEnumerable<Order_master> Select(string sql)
        {

            return _connection.Query<Order_master>(sql);
        }
    }
    public class ProductRepository : IRepository<Product>
    {
        private IDbConnection _connection = null;
        public ProductRepository(IDB db)
        {
            _connection = db.GetConnection();
        }
        public IEnumerable<Product> Select(string sql)
        {
            return _connection.Query<Product>(sql);
        }
    }
posted @ 2020-07-09 23:41  .Neterr  阅读(875)  评论(0编辑  收藏  举报