摘要
本文以C#示例说明桥接模式的概念和应用场景。
定义
桥接模式(Bridge Pattern, 是软件设计模式的一种。它把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。维基百科
解读
- 关键词:分离行为和特征,独立变化;
- 符合开闭原则;
- 应用场景: 在软件系统中,某些类型由于自身的逻辑,具有两个或多个变化的维度;
现实生活中的场景
- 汽车厂商生产的汽车和车载导航;
- 品牌电脑的生产过程;
- 软件架构中的 ORM 和 BLL 层之间的关系;
ORM和业务层
public interface IDbHelper
{
//连接到数据库
void Connect();
//获取数据
void GetData();
}
public class MySqlHelper : IDbHelper
{
public void Connect()
{
System.Console.WriteLine("连接到MySql");
}
public void GetData()
{
System.Console.WriteLine("获取MySql的数据");
}
}
public class RedisHelper : IDbHelper
{
public void Connect()
{
System.Console.WriteLine("连接到 redis");
}
public void GetData()
{
System.Console.WriteLine("获取Redis的数据");
}
}
public abstract class absService
{
private IDbHelper DbHelper;
public absService(IDbHelper dbHelper)
{
this.DbHelper = dbHelper;
}
public void DoSomething()
{
this.DbHelper.Connect();
this.DbHelper.GetData();
}
}
public class LogService : absService
{
private IDbHelper dbObject;
public LogService(IDbHelper dbHelper) : base(dbHelper) { }
}
public class ReportService : absService
{
private IDbHelper dbObject;
public ReportService(IDbHelper dbHelper) : base(dbHelper) { }
}
class Program
{
public static void Main(string[] args)
{
IDbHelper redisHelper = new RedisHelper();
IDbHelper mySqlHelper = new MySqlHelper();
LogService logService = new LogService(mySqlHelper);
ReportService reportService = new ReportService(redisHelper);
logService.DoSomething();
reportService.DoSomething();
}
}
- 在上面的示例中,被注入的IDbHelper接口和抽象基类abstractService的实现类之间处于解耦状态。它们可以各自独立的变化。
- 用户程序(Program)将IDbHelper的实例注入到abstractService的实现类中。Service层的实现类并不需要关心注入进来的是IDbHelper接口的哪个实现(RedisHelper或MySqlHelper),只要按照接口的约定调用Connect和GetData方法即可。在本例中,抽象基类调用了接口方法。
那么
- 假如有一天,老大有了新的需求,需要对MongoDb进行操作,那么只要增加IDbHelper接口的实现就可以了。
- 再如有一天,除了日志(Log)和报表(Report),还需要增加一个business的Service,那就只需要增加abstractService的子类即可。
上面的IDbHelper和abstractService,他们通过接口IDbHelper连接和解耦,所以,这两个接口(个人习惯将抽象类也叫做接口),还是有半毛钱的关系的,而且这半毛钱的关系在这两个接口之间起到了一个很关键的衔接作用。
桥接模式是我们在开发中经常用到的模式之一,只要理解里其中的含义,就可以灵活运用,使我们的开发过程更加符合设计原则,增强系统的可维护性和扩展性。