zoukankan      html  css  js  c++  java
  • 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.增加了系统的复杂程度。

  • 相关阅读:
    Codeforces 1082 毛毛虫图构造&最大权闭合子图
    BZOJ 1003 最短路dp
    BZOJ 1002 生成树计数&高精度
    BZOJ 1001 平面图转对偶图
    BZOJ 世界树
    一般图极大团个数,最大团顶点数
    第十五届四川省省赛 SCU
    第十五届四川省省赛 SCU
    第十五届四川省省赛 SCU
    BZOJ4671异或图
  • 原文地址:https://www.cnblogs.com/shadoll/p/14301373.html
Copyright © 2011-2022 走看看