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

来源:互联网 发布:mmd舞蹈动作数据下载 编辑:程序博客网 时间:2024/05/08 21:13

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

下边是我的理解和实验。

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

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();

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

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

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

欢迎大家评论。


0 0