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.增加了系统的复杂程度。

 

posted @ 2021-01-20 13:06  shine声  阅读(181)  评论(0编辑  收藏  举报