设计模式04———桥接模式 c#

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

设计模式04———桥接模式 c#_第1张图片

设计模式04———桥接模式 c#_第2张图片

设计模式04———桥接模式 c#_第3张图片

设计模式04———桥接模式 c#_第4张图片

桥接模式(Bridge Pattern)是一种软件设计模式,属于结构型模式,它用于将抽象部分与具体实现部分分离,以便它们可以独立地变化。这种模式通过创建一个连接(桥)来将抽象和实现部分分离,从而允许它们可以独立地进行扩展和变化。

桥接模式的主要目标是解耦抽象部分(如类或对象)和实现部分(如具体类或对象),从而可以分别对它们进行扩展或修改,而不会相互影响。这提供了更大的灵活性和可维护性,特别是在需要支持多种不同的抽象和实现组合的情况下。

通常,桥接模式包括以下角色:

  1. 抽象(Abstraction):定义抽象部分的接口,并维护一个指向实现部分的引用。通常包含抽象方法,用于委托实现部分完成具体工作。

  2. 具体抽象(Concrete Abstraction):实现抽象接口,通常是一个具体类,它与实现部分关联,将抽象方法的调用委托给实现部分。

  3. 实现(Implementor):定义实现部分的接口,通常包含实现方法,这些方法可以被具体实现类重写以提供不同的实现。

  4. 具体实现(Concrete Implementor):实现实现接口,提供具体的实现逻辑。

桥接模式的典型应用包括在图形系统中将不同的形状(抽象部分)和不同的颜色(实现部分)组合起来,以实现各种不同的图形。通过使用桥接模式,可以轻松地添加新的形状或颜色,而不需要修改已有的代码,实现了系统的可扩展性和可维护性。这是一个典型的例子,但桥接模式在各种其他领域也有广泛的应用。

设计模式04———桥接模式 c#_第5张图片

namespace BridgePatternFour{
    //魔法效果抽象类
    public abstract class IMagic{
        //施放魔法
        public abstract void Cast();
    }
}
设计模式04———桥接模式 c#_第6张图片

using System;
namespace BridgePatternFour{
    public class MagicFire : IMagic{
        public override void Cast(){
            Console.WriteLine("同时释放火焰魔法");
        }
    }
}
设计模式04———桥接模式 c#_第7张图片

using System;
namespace BridgePatternFour{
    public class MagicSnow : IMagic{
        public override void Cast(){
            Console.WriteLine("同时释放冰冻魔法");
        }
    }
}
 

抽象武器基类

设计模式04———桥接模式 c#_第8张图片

武器子类

设计模式04———桥接模式 c#_第9张图片

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();
        }
    }
}
动作基类

设计模式04———桥接模式 c#_第10张图片

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

设计模式04———桥接模式 c#_第11张图片

using System;
namespace BridgePatternFour{
    public class ActionStab : IAction{
        public ActionStab(string name) : base(name){
        }
        public override void Behaviour(){
            Console.WriteLine($"播放{Name}刺动作");
        }
    }
}
设计模式04———桥接模式 c#_第12张图片

using System;
namespace BridgePatternFour{
    public class ActionCut : IAction{
        public ActionCut(string name) : base(name){
        }
        public override void Behaviour(){
            Console.WriteLine($"播放{Name}砍动作");
        }
    }
}

更新武器基类

设计模式04———桥接模式 c#_第13张图片

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;
        }  
    }
}

更新武器子类

设计模式04———桥接模式 c#_第14张图片

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();
        }
    }
}
修改动作基类 接近接口

设计模式04———桥接模式 c#_第15张图片

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

设计模式04———桥接模式 c#_第16张图片

using System;
namespace BridgePatternFour{
    public class ActionStab : IAction{
        public override void Behaviour(){
            Console.WriteLine($"播放{Name}刺动作");
        }
    }
}
设计模式04———桥接模式 c#_第17张图片

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

设计模式04———桥接模式 c#_第18张图片

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

设计模式04———桥接模式 c#_第19张图片

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

设计模式04———桥接模式 c#_第20张图片

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();
        }
    }
}
此时会发现增加一个新类除了武器类名不一样其他都是一样的,导致这个原因是该项目不需要,如果在需要一些热武器就可以去除其原有的抽象实现部分,因项目而异

设计模式04———桥接模式 c#_第21张图片


 

你可能感兴趣的:(设计模式,桥接模式)