设计模式-桥接模式
定义:将抽象和实现解耦,使得两者可以独立地变化。
桥接模式的通用类图如下
结构说明:
Abstraction 抽象化角色
定义出该角色的行为,同时保存一个对实现角色的引用,该角色一般是抽象类
RefinedAbstraction 修正抽象化角色
引用实现化角色对抽象化进行修正
Implementor 实现化角色
它是接口或者抽象类,定义角色必须的行为和属性
ConcreteImplementor 具体实现化角色
实现接口或者抽象类定义的方法和属性
下面以房产公司为例,展示房屋从建造到销售的过程。
首先是建筑公司建造房屋,然后交付给装修公司对房屋进行装修,装修好的房屋最终交付给销售公司进行销售,每个公司都要有自己的工作人员,建筑公司需要建筑工人,装修公司需要装修工人,销售公司需要销售人员。
对工作人员进行抽象,工作人员有两个功能:工作、收工资
员工抽象类
// 员工抽象类
public interface IWorker
{
// 工作
void Working();
// 发薪日
void PayDay(float money);
}
建筑工人:建筑公司的工人,真正建造房屋的工作人员
// 建筑工人
public class Builder : IWorker
{
// 工作
public void Working()
{
Console.WriteLine("建造房屋,搬砖啦");
}
// 发薪日
public void PayDay(float money)
{
Console.WriteLine("发工资了:" + money + " 要把钱寄回老家 \n");
}
}
装修工人:装修公司的工人,真正装修房屋的工作人员
// 房屋装修工人
public class HouseFitter : IWorker
{
// 工作
public void Working()
{
Console.WriteLine("装修房屋,安装地暖、贴瓷砖、安装电路");
}
// 发薪日
public void PayDay(float money)
{
Console.WriteLine("发工资了:" + money + " 为了节省到工作地的时间,要买一辆电动自行车 \n");
}
}
销售人员:销售公司的工人,真正销售房屋的工作人员
// 房产销售人员
public class RealEstateSales : IWorker
{
// 工作
public void Working()
{
Console.WriteLine("联系客户,带客户看房,给客户讲解周围商圈");
}
// 发薪日
public void PayDay(float money)
{
Console.WriteLine("发工资了:" + money + " 请同事吃饭 \n");
}
}
对公司进行抽象,公司的共同功能:运营公司、发工资
公司抽象类
// 公司抽象类
public abstract class Crop
{
protected IWorker iWorker;
// 定义构造函数,子类必须继承该构造函数
// 将 具体的 IWorker 传递进来
public Crop(IWorker worker)
{
this.iWorker = worker;
}
// 公司经营操作
public virtual void Operation()
{
iWorker.Working();
}
// 发薪日
public virtual void PayDay()
{
iWorker.PayDay(50000);
}
}
建筑公司:管理房屋建造
// 建筑公司
public class ConstructionCrop : Crop
{
// 建筑公司需要的是建筑工人
public ConstructionCrop(Builder builder) : base(builder)
{
}
// 公司经营操作
public override void Operation()
{
base.Operation();
}
// 发薪日
public override void PayDay()
{
// 由于这个月工人都比较辛苦,每个人多发 1000 奖金
float wage = 10000;
float bonus = 1000;
float money = wage + bonus;
iWorker.PayDay(money);
}
}
装修公司:管理房屋建造完成后对房屋进行装修
/// <summary>
/// 房屋装修公司
/// </summary>
public class HouseDecorationCorp : Crop
{
private int workDay = 0;
// 装修工人需要的是装修工人
public HouseDecorationCorp(HouseFitter houseFitter) : base(houseFitter)
{
}
// 公司经营操作
public override void Operation()
{
// 为了让大家有更好的经历工作
// 公司决定每周让工人休息一天
if (workDay >= 6)
{
workDay = 0;
return;
}
iWorker.Working();
++workDay;
}
// 发薪日
public override void PayDay()
{
base.PayDay();
}
}
销售公司:管理房屋装修完成后开始售卖
// 房产销售公司
public class RealEstateSalesCrop : Crop
{
private int houseCount = 1000;
public RealEstateSalesCrop(RealEstateSales realEstateSales) : base(realEstateSales)
{
}
// 工作
public override void Operation()
{
// 销售的特殊性,平时没有假期
// 房子卖完后,可以休假一个月
if (houseCount > 0)
{
iWorker.Working();
houseCount--;
}
}
// 发薪日
public override void PayDay()
{
// 销售是有提成的,薪资根据销售量增加
// 由于这个月工人都比较辛苦,每个人多发 1000 奖金
float wage = 5000;
// 业绩不错卖了20套
int sales = 20;
// 每套房提成 1000
float deduct = 1000;
float money = wage + deduct * sales;
iWorker.PayDay(money);
}
}
调用如下
class BridgePattern
{
public BridgePattern()
{
// 创建建筑工人
Builder builder = new Builder();
// 创建建筑公司
Crop constructionCrop = new ConstructionCrop(builder);
constructionCrop.Operation();
constructionCrop.PayDay();
// 创建装修工人
HouseFitter houseFitter = new HouseFitter();
// 创建装修公司
HouseDecorationCorp houseDecorationCorp = new HouseDecorationCorp(houseFitter);
houseDecorationCorp.Operation();
houseDecorationCorp.PayDay();
// 创建房地产销售人员
RealEstateSales realEstateSales = new RealEstateSales();
// 创建房地产公司
RealEstateSalesCrop realEstateSalesCrop = new RealEstateSalesCrop(realEstateSales);
realEstateSalesCrop.Operation();
realEstateSalesCrop.PayDay();
}
}
优点:
(1) 把抽象、接口与实现解耦
(2) 抽象和实现可以独立扩展
(3) 实现细节对客户透明
缺点:
(1) 增加了系统复杂性
(2) 使用范围具有一定的局限性