桥接模式就是要解决“多对多”的爆炸性变化问题。

例如:

手机N个
运营商N个
操作系统N个
所以市面上的手机使用者有(手机数量*运营商数量*操作系统数量)个可能性。这对于编程来说是一个非常庞大的变化量
假如你做一个手机网站,模拟市面上的各种品牌手机(苹果、三星、华为、小米。。。。。),各种操作系统(IOS\Android\Winphone),各个运营商(移动、联通、电信、广电),如果你不使用抽像的方法,你需要写的对象是,
各种品牌手机*各种操作系统*各个运营商 ,这将是一个恐怖的代码爆炸,但是你并不需要这么写。你可以把变化点抽取出来。手机,操作系统,运营商,这3个变化点,各自定一个接口。然后在手机上面,桥接另外两个(操作系统、运营商)变化点。具体如何做?

代码:

手机端

    /// <summary>
    /// 手机抽象基类
    /// </summary>
    public abstract class BasePhone
    {
        /// <summary>
        /// 桥接运营商
        /// </summary>
        public IProvider CurrentProvider = null;
        /// <summary>
        /// 桥接操作系统
        /// </summary>
        public ISystem CurrentSystem = null;
        public abstract void Call();
        public abstract void Message();
    }
    /// <summary>
    /// 实现手机基类的抽象
    /// </summary>
    public class Iphone : BasePhone
    {
        public override void Call()
        {
            Console.WriteLine("我正在使用{0}手机、使用{1}网络,使用{2}操作系统打电话", this.GetType(), CurrentProvider.Provider(), CurrentSystem.System());
        }

        public override void Message()
        {
            Console.WriteLine("我正在使用{0}手机、使用{1}网络,使用{2}操作系统发短信", this.GetType(), CurrentProvider.Provider(), CurrentSystem.System());
        }
    }

运营商

    /// <summary>
    /// 抽象运营商
    /// </summary>
    public interface IProvider
    {
        string Provider();
    }
    /// <summary>
    /// 实现运营商抽象
    /// </summary>
    class ChinaMobile : IProvider
    {
        public string Provider()
        {
            return "China Mobile";
        }
    }

操作系统

    /// <summary>
    /// 抽象操作系统
    /// </summary>
    public interface ISystem
    {
        string System();
    }
    /// <summary>
    /// 实现操作系统抽象
    /// </summary>
    public class WinPhone : ISystem
    {
        public string System()
        {
            return "WinPhone";
        }
    }

具体使用:

        static void Main(string[] args)
        {

            BasePhone iphone = new Iphone();
            iphone.CurrentSystem = new Android();
            iphone.CurrentProvider = new ChinaMobile();
            iphone.Call();
            iphone.Message();


            BasePhone xiaomi = new Xiaomi();
            xiaomi.CurrentSystem = new IOSStystem();
            xiaomi.CurrentProvider = new ChinaTelecom();
            xiaomi.Call();
            xiaomi.Message();

            Console.Read();

        }

运行结果:

 

总结:

通过桥接模式,我们把 原有的关系:手机数量*运营商数量*操作系统数量,变成了 手机数量+运营商数量+操作系统数量,解决了代码爆炸的问题!

posted on 2016-05-17 08:46  梦回过去  阅读(227)  评论(0编辑  收藏  举报