桥接模式:将一个事物从多个维度抽象出来,采用 分离 和 组合 的方式 替代 原本类的继承




桥接模式(Bridge Pattern)是一种软件设计模式,属于结构型模式,它用于将抽象部分与具体实现部分分离,以便它们可以独立地变化。这种模式通过创建一个连接(桥)来将抽象和实现部分分离,从而允许它们可以独立地进行扩展和变化。
桥接模式的主要目标是解耦抽象部分(如类或对象)和实现部分(如具体类或对象),从而可以分别对它们进行扩展或修改,而不会相互影响。这提供了更大的灵活性和可维护性,特别是在需要支持多种不同的抽象和实现组合的情况下。
通常,桥接模式包括以下角色:
-  抽象(Abstraction):定义抽象部分的接口,并维护一个指向实现部分的引用。通常包含抽象方法,用于委托实现部分完成具体工作。 
-  具体抽象(Concrete Abstraction):实现抽象接口,通常是一个具体类,它与实现部分关联,将抽象方法的调用委托给实现部分。 
-  实现(Implementor):定义实现部分的接口,通常包含实现方法,这些方法可以被具体实现类重写以提供不同的实现。 
-  具体实现(Concrete Implementor):实现实现接口,提供具体的实现逻辑。 
桥接模式的典型应用包括在图形系统中将不同的形状(抽象部分)和不同的颜色(实现部分)组合起来,以实现各种不同的图形。通过使用桥接模式,可以轻松地添加新的形状或颜色,而不需要修改已有的代码,实现了系统的可扩展性和可维护性。这是一个典型的例子,但桥接模式在各种其他领域也有广泛的应用。


namespace BridgePatternFour{
     //魔法效果抽象类
     public abstract class IMagic{
         //施放魔法
         public abstract void Cast();
     }
 }
using System;
 namespace BridgePatternFour{
     public class MagicFire : IMagic{
         public override void Cast(){
             Console.WriteLine("同时释放火焰魔法");
         }
     }
 }
using System;
 namespace BridgePatternFour{
     public class MagicSnow : IMagic{
         public override void Cast(){
             Console.WriteLine("同时释放冰冻魔法");
         }
     }
 }
  
抽象武器基类

武器子类

using System;
 namespace BridgePatternFour{
     public class WeaponSword : IWeapon{
         public WeaponSword(string name, IMagic magic) : base(name, magic){
         }
         public override void Attack(){
             //待改进写死的实现  
             Console.WriteLine($"挥舞{Name}发动攻击");
             //抽象部分
             _magic.Cast();
         }
     }
 }
 动作基类

namespace BridgePatternFour{
     public abstract class IAction{
         //动作名称
         public string Name { set; get; }
         //播放动作动画
         public abstract void Behaviour();
         public IAction(string name) {
             Name = name;
         }
     }
 }
 动作子类

using System;
 namespace BridgePatternFour{
     public class ActionStab : IAction{
         public ActionStab(string name) : base(name){
         }
         public override void Behaviour(){
             Console.WriteLine($"播放{Name}刺动作");
         }
     }
 }
using System;
 namespace BridgePatternFour{
     public class ActionCut : IAction{
         public ActionCut(string name) : base(name){
         }
         public override void Behaviour(){
             Console.WriteLine($"播放{Name}砍动作");
         }
     }
 }
更新武器基类

namespace BridgePatternFour{
     public abstract class IWeapon{
         //武器名称
         public string Name { get; set; }
         //魔法的引用
         protected IMagic _magic = null;
         //动作的引用
         protected IAction _action = null;
         //构造方法
         public IWeapon(string name, IMagic magic) {
             Name = name;
             _magic = magic;
         }
         //抽象攻击方法
         public abstract void Attack();
         //设置动作
         //注意:此方法不许重写,延申到子类没有意义
         public void SetAction(IAction action) {
             _action = action;
         }  
     }
 }
 更新武器子类

using System;
 namespace BridgePatternFour{
     public class WeaponSword : IWeapon{
         public WeaponSword(string name, IMagic magic) : base(name, magic){
         }
         public override void Attack(){
             Console.WriteLine($"{Name}发动攻击");
             //抽象部分
             if(_action != null)
                 _action.Behaviour();
             //抽象部分
             if(_magic != null)
                 _magic.Cast();
         }
     }
 }
 修改动作基类 接近接口

namespace BridgePatternFour{
     public abstract class IAction{
         //动作名称
         protected string Name { set; get; }
         //播放动作动画
         public abstract void Behaviour();
     }
 }
 修改动作子类

using System;
 namespace BridgePatternFour{
     public class ActionStab : IAction{
         public override void Behaviour(){
             Console.WriteLine($"播放{Name}刺动作");
         }
     }
 }
using System;
 namespace BridgePatternFour{
     public class ActionStab : IAction{
         public override void Behaviour(){
             Console.WriteLine($"播放{Name}刺动作");
         }
         public ActionStab() {
             Name = "刺";
         }
     }
 }
 同样

using System;
 namespace BridgePatternFour{
     public class ActionCut : IAction{
         public override void Behaviour(){
             Console.WriteLine($"播放{Name}砍动作");
         }
         public ActionCut() {
             Name = "砍";
         }
     }
 }
 更新Program类

namespace BridgePatternFour{
     public class Program{
         public static void Main(string[] args) {
             IWeapon weapon = new WeaponSword("倚天剑", new MagicSnow());
             weapon.SetAction(new ActionStab());
             weapon.Attack();
         }
     }
 }
 此时是单维度的(单剑),加一个弓变成双维度(双剑弓)

using System;
 namespace BridgePatternFour{
     public class WeaponBow : IWeapon{
         public WeaponBow(string name, IMagic magic) : base(name, magic){
         }
         public override void Attack(){
             Console.WriteLine($"{Name}发动攻击");
             //抽象部分
             if (_action != null)
                 _action.Behaviour();
             //抽象部分
             if (_magic != null)
                 _magic.Cast();
         }
     }
 }
 此时会发现增加一个新类除了武器类名不一样其他都是一样的,导致这个原因是该项目不需要,如果在需要一些热武器就可以去除其原有的抽象实现部分,因项目而异
