設計模式(8)---橋接模式

定義:ide

橋接模式:將抽象部分與它的實現部分分離,使它們均可以獨立地變化。學習

解釋:抽象與它的實現分離並非說讓抽象類與其派生類分離,而是抽象類和它的派生類用來實現本身的對象。this

 

UML類圖和基本代碼:spa

class Program
    {
        static void Main(string[] args)
        {
            Abstration ab = new RefinedAbstration();

            ab.SetImplementor (new ConcreteImplementorA ());
            ab.Operation();

            ab.SetImplementor(new ConcreteImplementorB());
            ab.Operation();

            Console.Read();
        }
    }

    abstract class Implementor
    {
        public abstract void Operation();
    }

    class ConcreteImplementorA : Implementor
    {
        public override void Operation()
        {
            Console.WriteLine("implement A action");
        }
    }

    class ConcreteImplementorB : Implementor
    {
        public override void Operation()
        {
            Console.WriteLine("implement B action");
        }
    }

    class Abstration
    {
        protected Implementor implementor;

        public void SetImplementor(Implementor implementor)
        {
            this.implementor = implementor;
        }

        public virtual void Operation()
        {
            implementor.Operation();
        }
    }

    class RefinedAbstration : Abstration
    {
        public override void Operation()
        {
            implementor.Operation();
        }
    }
View Code

 

在網上看到一個實例,感受很是貼切,」拿來主義「參考學習。code

具體是:現實生活中實現遙控器,遙控器中並不包含開機、關機、換臺等功能的實現,遙控器只是包含了電視機上的這些功能的引用,而後紅外線去找到電視機上對應功能的實現。對象

抽象類電視機及生成長虹、三星電視機:blog

public abstract class TV
    {
        public abstract void On();
        public abstract void Off();
        public abstract void TurnChannel();
    }

    public class ChangHong : TV
    {
        public override void On()
        {
            Console.WriteLine("長虹牌電視機已經打開了");
        }

        public override void Off()
        {
            Console.WriteLine("長虹牌電視機已經關掉了");
        }

        public override void TurnChannel()
        {
            Console.WriteLine("長虹牌電視機換頻道");
        }
    }

    public class Samsung : TV
    {
        public override void On()
        {
            Console.WriteLine("三星牌電視機已經打開了");
        }

        public override void Off()
        {
            Console.WriteLine("三星牌電視機已經關掉了");
        }

        public override void TurnChannel()
        {
            Console.WriteLine("三星牌電視機換頻道");
        }
    }
View Code

 

 抽象類遙控器及實現:接口

public class RemoteControl
    {
        private TV implementor;
        public TV Implementor
        {
            get { return implementor; }
            set { implementor = value; }
        }

        public virtual void On()
        {
            implementor.On();
        }

        public virtual void Off()
        {
            implementor.Off();
        }

        public virtual void TurnChannel()
        {
            implementor.TurnChannel();
        }
    }

    public class ConcreteRemote : RemoteControl
    {
        
    }
View Code

 

客戶端調用:rem

RemoteControl remoteControl = new ConcreteRemote();

            remoteControl.Implementor = new ChangHong();
            remoteControl.On();
            remoteControl.Off();
            remoteControl.TurnChannel();

 

優勢:get

抽象接口與實現解耦。

抽象和實現均可以獨立擴展,不會影響到對方。

缺點:

增長了系統的複雜度。

 

適用場景:

一個類存在兩個獨立變化的維度,且兩個維度都須要進行擴展。

須要跨越多個平臺的圖形和窗口系統。

相關文章
相關標籤/搜索