设计模式(8)---桥接模式

2018-06-18 03:06:11来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

定义:

桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

解释:抽象与它的实现分离并不是说让抽象类与其派生类分离,而是抽象类和它的派生类用来实现自己的对象。

 

UML类图和基本代码:

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

 

在网上看到一个实例,感觉非常贴切,”拿来主义“参考学习。

具体是:现实生活中实现遥控器,遥控器中并不包含开机、关机、换台等功能的实现,遥控器只是包含了电视机上的这些功能的引用,然后红外线去找到电视机上对应功能的实现。

抽象类电视机及生成长虹、三星电视机:

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

 

客户端调用:

RemoteControl remoteControl = new ConcreteRemote();

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

 

优点:

抽象接口与实现解耦。

抽象和实现都可以独立扩展,不会影响到对方。

缺点:

增加了系统的复杂度。

 

适用场景:

一个类存在两个独立变化的维度,且两个维度都需要进行扩展。

需要跨越多个平台的图形和窗口系统。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:如何安全实现“记住我”的功能

下一篇:C#基础---事件的使用