用23种设计模式打造一个cocos creator的游戏框架----(十一)桥接模式

1、模式标准

模式名称:桥接模式

模式分类:结构型

模式意图:将抽象部分与其实现部分分离,使它们都可以独立地变化。

结构图:

适用于:

1、不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如,这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。

2、类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这是 Bridge 模式使得开发者可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。

3、对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译

4、想在多个对象间共享实现 (可能使用引用计数),但同时要求客户并不知道这一点

主要成员:

  • 抽象类(Abstraction):定义和保存客户端的引用,维护与实现对象之间的关联关系。
  • 扩展抽象类(Refined Abstraction):扩展和精化抽象类中的接口定义。
  • 实现类接口(Implementor):定义实现类的接口,可以与抽象类的接口相互独立。
  • 具体实现类(Concrete Implementor):具体实现接口,在不同的实现类中提供基本操作的不同实现。

2、分析与设计

桥接模式,通俗点讲就如同嫁接,比如有一个树,会开花结果,我给它嫁接苹果枝,在开花结果后,长的是苹果。如果嫁接橘子枝,在开花结果后,长的是橘子。

在游戏开发中,可能会用在角色的武器切换上,不同的武器拥有不同的攻击方式。拥有剑就拥有了剑的攻击效果,拥有弓箭就拥有弓的攻击效果。下面我们来描述一下新的意图

意图:将抽象部分(攻击)与其实现部分(剑攻击还是弓箭攻击)分离,使它们都可以独立地变化(剑有剑的攻击效果,弓有弓的攻击效果)。

3、开始打造

TypeScript 复制代码
// 武器接口
export interface IWeapon {
    attack()
}
TypeScript 复制代码
// 剑
export class Sword implements IWeapon {
    attack(): void {
        console.log("攻击使用了剑");
    }
}
TypeScript 复制代码
// 弓
export class Bow implements IWeapon {
    attack(): void {
        console.log("攻击使用了弓");
    }
}
TypeScript 复制代码
// 抽象攻击者
export abstract class Fighter {
    protected weapon: IWeapon;

    constructor(weapon: IWeapon) {
        this.weapon = weapon;
    }

    attack(): void {
        this.weapon.attack();
    }

    setWeapon(weapon: IWeapon): void {
        this.weapon = weapon;
    }
}
TypeScript 复制代码
// 骑兵
export class Cavalry extends Fighter {
    constructor(weapon: IWeapon) {
        super(weapon);
    }
}

4、开始使用

TypeScript 复制代码
export class UnitItem extends Component implements IItem, IUnitItem {

    private ad: number = 100;
    private role: Fighter;

    accept(visitor: IAttackVisitor) {
        visitor.visitUnitItem(this)
    }

    async attack(unitItem: UnitItem<T>) {
        this.role.attack(); // 攻击

        let damage = this.ad
        let attackVisitor = new MonomerAttackVisitor(damage)
        unitItem.accept(attackVisitor)
    }

    setRole(role: Fighter): void {
        this.role = role;
    }
}
TypeScript 复制代码
let unitItem001 = xhgame.itemFactory.createUnitItem('shibing_001')
let unitItem002 = xhgame.itemFactory.createUnitItem('shibing_002')

unitItem001.setRole(new Cavalry(new Sword()));
console.log('unitItem001(骑兵)使用【剑】对unitItem001发起了攻击')
unitItem001.attack(unitItem002)

unitItem001.setRole(new Cavalry(new Bow()));
console.log('unitItem001(骑兵)使用【弓】对unitItem001发起了攻击')
unitItem001.attack(unitItem002)
相关推荐
麓殇⊙11 分钟前
设计模式--桥接模式详解
设计模式·桥接模式
学习机器不会机器学习1 小时前
深入浅出JavaScript常见设计模式:从原理到实战(1)
开发语言·javascript·设计模式
Mu先生Ai世界3 小时前
AI 生成 3D 技术解析:驱动力、价值主张与核心挑战 (AI+3D 产品经理笔记 S2E01)
人工智能·游戏·3d·aigc·transformer·产品经理·vr
ApeAssistant4 小时前
Spring + 设计模式 (二十) 行为型 - 中介者模式
spring·设计模式
ApeAssistant4 小时前
Spring + 设计模式 (十九) 行为型 - 访问者模式
spring·设计模式
〆、风神5 小时前
从零实现分布式WebSocket组件:设计模式深度实践指南
分布式·websocket·设计模式
前端大白话5 小时前
Vue2和Vue3语法糖差异大揭秘:一文读懂,开发不纠结!
javascript·vue.js·设计模式
前端大白话5 小时前
JavaScript中`Symbol.for()`和`Symbol()`的区别,在创建全局唯一的`Symbol`值时如何选择使用?
前端·javascript·设计模式
CHQIUU6 小时前
Java 设计模式心法之第25篇 - 中介者 (Mediator) - 用“中央协调”降低对象间耦合度
java·设计模式·中介者模式
Pasregret7 小时前
备忘录模式:实现对象状态撤销与恢复的设计模式
运维·服务器·设计模式