定义
定义一个接口类,然后实现的部分在子类中完成。
组成部分
Abstraction (抽象体接口)
拥有直向Implementor的对象引用。
定义抽象对象的接口,也可作为子类调用实现功能的接口。
RefindAbstraction(抽象体实现,扩充)
继承抽象体并调用Implementor完成实现功能。
扩充抽象体的接口,增加额外的功能。
Implementor(实现体接口)
定义实现功能的接口,提供Abstraction使用
接口功能可以只有单一的功能,真正的选择是由Abstraction的需求加以组合应用。
ConcreteImplementorAB(实现体)
实际完成实现接口上的定义的方法。
游戏应用
在设计植物大战僵尸的植物攻击时,可以分普通子弹攻击和投射攻击等等,所以我们可以把植物作为抽象体,攻击方式作为实现体。
Abstraction实现, ICharacter作为植物和僵尸的父类,拥有指向武器IWeapon对象的引用
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class ICharacter
{
private IWeapon m_Weapoon = null;
public void SetWeapon(IWeapon weapon)
{
m_Weapoon = weapon;
}
public IWeapon GetWeapon()
{
return m_Weapoon;
}
public void SetWeaponPlusAttack()
{
m_Weapoon.Fire();
}
public abstract void Attack();
}
RefinedAbsraction实现,这里介绍植物的,实现父类的Attack的方法
public class IPlant : ICharacter
{
public override void Attack()
{
SetWeaponPlusAttack();
}
}
Implementor实现
public abstract class IWeapon
{
public abstract void Fire();
}
ConcreteImplementorAB实现,Weapon_1 和Weapon_2中实现具体攻击实现(包括攻击特效,音效等等)
public class Weapon_1 : IWeapon
{
//普通攻击
public override void Fire()
{
Debug.Log("普通攻击");
}
}
public class Weapon_2 : IWeapon
{
//投射攻击
public override void Fire()
{
Debug.Log("投射攻击");
}
}
优缺点
该优点是降低系统之间的耦合,上面用例中ICharacter就是抽象类,定义了攻击目标的功能,而实现真正的攻击类是IWeapon里。对于两者不必理会双方的变化,尤其是游戏开发后期可能增加的武器或者角色类。