设计模式-桥接模式

设计模式-桥接模式

定义:将抽象和实现解耦,使得两者可以独立地变化。

桥接模式的通用类图如下
在这里插入图片描述

结构说明:
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) 使用范围具有一定的局限性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值