桥接模式
桥接模式是一种对象结构性模式,作用是在复杂或多维度的对象中,将抽象和实现分离,用聚合或组合的方式替代继承来实现,从而降低抽象和实现多个可变维度的耦合度。
我们生活中有很多例子,如遥控器和电视机,遥控器是抽象维度,电视机是实现维度。使用者只需关注抽象维度即可。也有将对象分为两种或多种组合式的维度,如物体和颜色,紫色的正方形,蓝色的圆形等,物体是一个维度,颜色是一个维度。
结构
说明
- 抽象化(Abstraction)- 提供高层控制逻辑,其操作依赖于实现化。
- 精确抽象 (Refined Abstraction)- 是抽象化的变体,其操作同样依赖于实现化
- 实现化(Implementor)- 为具体实现声明通用的接口。提供功能抽象
- 具体实现(Concrete Implementor)- 实现接口方法
实现
实现化 - 怪物接口
public interface IMonster
{
void Attack();
void Die();
}
具体实现 - 机器人,坦克
public class Robot : IMonster
{
public void Attack()
{
Debug.Log("打了一拳");
}
public void Die()
{
Debug.Log("死亡");
}
}
public class Tank : IMonster
{
public void Attack()
{
Debug.Log("发出炮弹");
}
public void Die()
{
Debug.Log("报废");
}
}
抽象化 - 怪物控制器
public abstract class MonsterController
{
protected IMonster _monster;
public MonsterController(IMonster monster)
{
_monster = monster;
}
public abstract void Attack();
public abstract void Die();
}
精确控制 - 机器人控制器,坦克控制器
public class RobotController : MonsterController
{
public RobotController(IMonster monster) : base(monster)
{
}
public override void Attack()
{
Debug.Log("机器人: ");
_monster.Attack();
}
public override void Die()
{
Debug.Log("机器人: ");
_monster.Die();
}
}
public class TankController : MonsterController
{
public TankController(IMonster monster) : base(monster)
{
}
public override void Attack()
{
Debug.Log("坦克: ");
_monster.Attack();
}
public override void Die()
{
Debug.Log("坦克: ");
_monster.Die();
}
}
调用
public class BridgeExample : MonoBehaviour
{
private void Start()
{
MonsterController controller1 = new RobotController(new Robot());
MonsterController controller2 = new TankController(new Tank());
controller1.Attack();
controller1.Die();
controller2.Attack();
controller2.Die();
}
}
应用场景
- 你需要拆分或重组一个多重功能的复杂类,从而降低类的复杂度。
- 你需要将一个类分为多个独立维度,来降低各个独立维度的耦合性。
利与弊
优点
- 调用端只需关注抽象化即可,无需接触实现化相关类
- 满足开闭原则,各个维度自行扩展,互不干涉。
- 抽象化,只关注依赖于实现化的高层逻辑,实现化则关注功能的实现,符合单一职责原则
缺点
- 对高内聚的类使用,可能会让代码更加复杂
桥接模式,听着很玄乎,抽象化和实现化等,但实际上十分容易。抽象化本身就是为了对多个维度的实现化进行综合,从而相互交互,本身不进行功能实现,只关注逻辑。但也可以通过精确抽象的方式,去扩展多种不同的实现逻辑。其中遥控器和电视机,就是很好的例子。
通过继承的方式来完成抽象和实现的关系,适用于简单的类,对于复杂或多维度的对象,适用桥接来实现抽象化和实现化,非常合适。
🐉🐉🐉🐉🐉