• C# 设计模式-桥接模式


    一.介绍  

      桥接模式(Bridge Pattern)。属于结构型模式。将抽象部分与它的实现部分分离,使得它们可以独立地变化。

    二.实现

      举个例子,魔术师的法杖可以用口令施展法术攻击,有火法杖和冰法杖,法杖可以施展射击。法杖可以定为Wand抽象类,火法杖和冰法杖来继承抽象,这样火法杖和冰法杖就能实现射击。如果再添加其它类型法杖,这样添加一个派生类就可以实现。

    public abstract class Wand
    {
        public virtual void Shooting()
        {
                
        }
    }
    
    public class FireWand: Wand
    {
        public override void Shooting()
        {
            Console.WriteLine("用口令施展火射击");
        }
    }
    
    public class IceWand : Wand
    {
        public override void Shooting()
        {
            Console.WriteLine("用口令施展冰射击");
        }
    }

      但如果有的魔术师喜欢用手势施展法术,那往抽象类添加一个手势施展法术的方法也可以处理,但如果法杖类型和法术类型同时修改的话,那这个设计就显得不太合适。魔术师一般只拿一根法杖,这个设计时一根法杖可以兼容口令施展和手势施展法术,但不兼容多类法术。用桥接模式就可以较好地解决这个问题。

    //法杖
    public abstract class Wand
    {
        private Magic magic;
        //存储法术
        public void SetMagic(Magic mg)
        {
            this.magic = mg;
        }
    
        public virtual void Shooting()
        {
            magic.Shooting();
        }
    }
    
    //法术
    public interface Magic
    {
        //施展法术射击
        void Shooting();
    }
    
    //A法杖
    public class AWand : Wand
    {
        public override void Shooting()
        {
            Console.WriteLine("用口令施展");
            base.Shooting();
        }
    }
    
    //B法杖
    public class BWand : Wand
    {
        public override void Shooting()
        {
            Console.WriteLine("用手势施展");
            base.Shooting();
        }
    }
    
    //火法术
    public class FireMagic : Magic
    {
        public void Shooting()
        {
            Console.WriteLine("火射击");
        }
    }
    
    //冰法术
    public class IceMagic : Magic
    {
        public void Shooting()
        {
            Console.WriteLine("冰射击");
        }
    }
    
    
    //调用
    public static void Main(string[] args)
    {
        //挑选法杖 a是口令 b是手势
        Wand a = new AWand();
        a.SetMagic(new FireMagic());//注入火法术
        a.Shooting();//火射击
    
        a.SetMagic(new IceMagic());//注入冰法术
        a.Shooting();//冰射击
    }

      上面的桥接模式实现中,法杖的功能方法不在法杖抽象类中实现了,而是把实现部分放到了法术类中,法杖只是调用法术而已。这样的设计也较为合理,法杖本身就是用来施展存储在里面法术的工具。这样就能把抽象化和实现化的部分分离开来,能很好的应对两个方面的变化。

    三.总结

      优点:

      1.把抽象接口与其实现解耦。

      2.抽象和实现可以独立拓展,不会影响到对方。

      缺点:

      1.增加了系统的复杂程度。

  • 相关阅读:
    failed: unacceptable content-type: text/html
    iOS button点击更换图片
    支付宝ios SDK官方下载页面
    xcode6 中使用OC代码时,在NSObject的子类中报错
    CocoaPods安装和使用教程
    Mac 下安装Ruby环境
    iOS .a与.framewofk
    Couldn't find preset "es2015" relative to directory问题解决
    yarn依赖管理工具的使用
    java.io.IOException: Could not delete path 'D:mycode eactnativeSecondTestandroidappuildgeneratedsource eleaseandroidsupportv7
  • 原文地址:https://www.cnblogs.com/shadoll/p/14301373.html
Copyright © 2020-2023  润新知