设计模式之浅浅的理解桥接模式

网上有不少博文都深入浅出的论述了桥接模式的作用和设计方法。不过我总觉得自己理解得不到位。

下边是我的理解和实验。

桥接模式理解:
在理解桥接模式中,网上的博客中都谈到抽象与实现的分离,这里的实现与继承中的实现不同。对一个多维可变的需求抽象出高级操作,封装在抽象类当中,将可变的因素封装在接口里,然后实现该接口。在抽象类中持有这些接口的引用,在高级操作里调用这些接口的实现方法。这使得需求的真正实现与抽象分离了出来。
假如有这样一个需求:
不同届的毕业生坐不同的车去不同的学校报名。应届、非应届
||火车、客车||一本学校、二本学校、三本学校

1、封装可变因素,这里我定义了三个接口

 public interface IGraduate
    {
        void print();
    }

    public class Graduates : IGraduate
    {
        public void print()
        {
            Console.Write("应届生");
        }
    }

    public class NonGraduates : IGraduate
    {
        public void print()
        {
            Console.Write("非应届生");
        }
    }

 public interface IWay
    {
        void print();
    }

    public class Train : IWay
    {
        public void print()
        {
            Console.Write("坐火车");
        }
    }

    public class Bus : IWay
    {
        public void print()
        {
            Console.Write("坐客车");
        }
    }
public interface IGrade
    {
        void print();
    }

    public class OneGrade : IGrade
    {
        public void print()
        {
            Console.Write("一本院校");
        }
    }

    public class TwoGrade : IGrade
    {
        public void print()
        {
            Console.Write("二本院校");
        }
    }

    public class ThreeGrade : IGrade
    {
        public void print()
        {
            Console.Write("三本院校");
        }
    }
2、抽象出高级操作并保持引用

public abstract class Entered
    {
        private IGraduate graduate;
        private IWay way;
        private IGrade grade;

        public IGraduate Graduate { get { return graduate; } }

        public IWay Way { get { return way; } }

        public IGrade Grade { get { return grade; } }

        public Entered(IGraduate graduate, IWay way, IGrade grade)
        {
            this.graduate = graduate;
            this.way = way;
            this.grade = grade;
        }

        public abstract void goEnter();
    }
3、网上的例子都将其中的一个变化因素用来显现该抽象了,这我这个例子中,我将所有变化因素都做成接口,接下来只是简单的继承该抽象。目的是搞清楚多个变化是如何桥接到抽象中来的。

public class WeEntered : Entered
    {
        public WeEntered(IGraduate graduate, IWay way, IGrade grade) : base(graduate, way, grade)
        {
        }

        public override void goEnter()
        {
            Graduate.print();
            Console.Write("-");
            Way.print();
            Console.Write("-");
            Grade.print();
        }
    }
4、最后的简单调用
 Entered entered = new WeEntered(new Graduates(),new Train(),new TwoGrade());

            entered.goEnter();

            Console.Read();

总结:此例中想要拓展任意一个变化都很方便,比如增加一种小轿车的类型。另外不同的变化拓展起来也很方便,比如在火车类里拓展一个运行时间等。

最终要的事情是要理解抽象与实现是什么,最最重要的事情是要动手写两遍。

本文写得很糙,大家不懂的地方可以网上查阅别的博文和资料,我这里最重要的是提供了一个和别的博文有点不同的例子。

欢迎大家评论。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值