JAVA橋接模式不同情況實現總結

橋接模式(Bridge),將抽象部分與它的實現部分分離,使它們都可以獨立地變化。

橋接模式比喻
早上碰到MM,要說早上好,晚上碰到MM,要說晚上好;碰到MM穿了件新衣服,要說你的衣服好漂亮哦,碰到MM新做的髮型,要說你的頭髮好漂亮哦。不要問我“早上碰到MM怎麼說晚上好”這種問題,自己用經委BRIDGE組合一下不就行了。這就是橋接模式了!

橋接模式意圖
橋接模式(Bridge)將抽象部分與它的實現部分分離,使它們都可以獨立地變化。

橋接模式類圖
 

www.zhuli8.com-朱利IT博客

橋接模式實現

    /// <summary>
    /// 我要說的話的抽象
    /// </summary>
    abstract class Bloger
    {
        public abstract void Greet();
    }

    /// <summary>
    /// 我說:早上好!
    /// </summary>
    class MorningImp : Bloger
    {
        public override void Greet()
        {
            Console.WriteLine("早上好!");
        }
    }

    /// <summary>
    /// 我說:晚上好
    /// </summary>
    class NightImp:Bloger
    {
        public override void Greet()
        {
            Console.WriteLine("晚上好!");
        }
    }

    /// <summary>
    /// 我說:你的衣服好漂亮哦!
    /// </summary>
    class ClothesImp : Bloger
    {
        public override void Greet()
        {
            Console.WriteLine("你的衣服好漂亮哦!");
        }
    }

    /// <summary>
    /// 我說:你的頭髮好漂亮哦!
    /// </summary>
    class HeadformImp : Bloger
    {
        public override void Greet()
        {
            Console.WriteLine("你的頭髮好漂亮哦!");
        }
    }

    /// <summary>
    /// 遇到MM的時機
    /// </summary>
    class Opportunity
    {
        protected Bloger imp;
        public void SetImp(Bloger imp)
        {
            this.imp = imp;
        }

        public virtual void ShowGreet()
        {
            Console.Write("遇見女生的場合:");
            imp.Greet();
        }
    }

    /// <summary>
    /// 時機:早上
    /// </summary>
    class Morning : Opportunity
    {
        public override void ShowGreet()
        {
            Console.Write("早上碰到MM:");
            imp.Greet();
        }
    }

    /// <summary>
    /// 時機:晚上
    /// </summary>
    class Night : Opportunity
    {
        public override void ShowGreet()
        {
            Console.Write("晚上碰到MM:");
            imp.Greet();
        }
    }

    /// <summary>
    /// 時機:碰到MM穿了件新衣服
    /// </summary>
    class Clothes : Opportunity
    {
        public override void ShowGreet()
        {
            Console.Write("碰到MM穿了件新衣服:");
            imp.Greet();
        }
    }

    /// <summary>
    /// 時機:碰到MM新做的髮型
    /// </summary>
    class Headform : Opportunity
    {
        public override void ShowGreet()
        {
            Console.Write("碰到MM新做的髮型:");
            imp.Greet();
        }
    }

    /// <summary>
    /// 橋接模式客戶端應用
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            //時機:早上
            Opportunity m = new Morning();
            //我說:早上好!
            m.SetImp(new MorningImp());
            m.ShowGreet();

            //時機:晚上
            Opportunity n = new Night();
            //我說:晚上好!
            n.SetImp(new NightImp());
            n.ShowGreet();

            //時機:碰到MM穿了件新衣服
            Opportunity c = new Clothes();
            //我說:你的衣服好漂亮哦!
            c.SetImp(new ClothesImp());
            c.ShowGreet();

            //時機:碰到MM新做的髮型
            Opportunity h = new Headform();
            //我說:你的頭髮好漂亮哦!
            h.SetImp(new HeadformImp());
            h.ShowGreet();

            //時機:早上
            Opportunity o=new Morning();
            //由於緊張,早上碰到MM竟然說了句"晚上好!",丟人啊!
            o.SetImp(new NightImp());
            o.ShowGreet();

            Console.Read();
        }
    } 

橋接模式總結
早上碰到MM,要說早上好的實現就是把早上遇到MM的時機和我要說的話組合起來就可以了。同樣的,早上遇到MM我也可以說晚上好,那就是把早上的時機和我要說的話:“晚上好”組合起來就可以了。橋接模式體現着放料閥合成/聚合複用原則,聚合表示一種弱的擁有關係,體現着AasB;合成則是一種強的擁有關係,體現着嚴格的部分和整體的關係,部分和整體的生命週期一樣,體現着AisB,儘量使用合成/聚合,儘量不要使用類繼承。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章