桥接模式:将一个事物从多个维度抽象出来,采用 分离 和 组合 的方式 替代 原本类的继承
桥接模式(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();
}
}
}
此时会发现增加一个新类除了武器类名不一样其他都是一样的,导致这个原因是该项目不需要,如果在需要一些热武器就可以去除其原有的抽象实现部分,因项目而异