每日一学2——设计模式之策略模式

学习来源:https://unity.cn/projects/you-xi-she-ji-mo-shi-zhi-ce-lue-mo-shi

这篇文章可以说写的非常好,由简入深,照着敲一遍就可以完全理解策略模式。

之前继承、接口都不十分明确地知道该什么时候使用,本文读下来受益匪浅。

整理一下学到的东西:
1.当应用程序中需要多个相似的类的时候,或后期维护中该类可能会出现多个相似类的时候,为此类创建一个抽象父类。比如说做游戏时,创建敌人、角色等这种明显需要一个父类统筹管理的名词性物体。再比如演示类项目中,演示的物品种类繁多,有不一样的地方但又有共通性时。
2.除了上述比较具象化的物体,抽象化的类,比如演示类项目中涉及知识点等也需要为其创建抽象父类。
使用方法如下:

  • 抽象父类
/// <summary>
/// 父类鸭子,abstract修饰抽象父类
/// </summary>
public abstract class Duck
{
    /// <summary>
    /// abstract抽象方法,abstract关键词表示所有子类想要继承Duck必须在子类中override重写Quack()方法。
    /// 因此在父类中只需要声明Quack()方法不需要也不可以添加{}具体实现方法,内容直接以“;”结尾。
    /// 但是抽象父类可以设置变量,要求子类也必须声明该变量。
    /// </summary>
    public abstract void Quack();

    /// <summary>
    /// virtual虚方法,与抽象方法不同,虚方法可以不override重写。
    /// 如果不重写直接调用子类的Swim()将直接调用父类的Swim()。
    /// 如果重写过则直接调用子类的Swim()。
    /// </summary>
    public virtual void Swim()
    {
        Debug.Log("Swim");
    }

    /// <summary>
    /// virtual虚方法通常什么都不实现
    /// </summary>
    public virtual void Fly() { }

    /// <summary>
    /// 声明一个接口IEat
    /// </summary>
    public IEat IEat;

    /// <summary>
    /// Duck本身不会Eat(),通过接口IEat来间接实现不同的Eat()
    /// </summary>
    public void Eat()
    {
        IEat.Eat();
    }
}
  • 接口及接口类
/// <summary>
/// 声明一个接口IEat,作为不同Eat类的接口,并声明Eat()方法
/// </summary>
public interface IEat
{
   void Eat();
}

/// <summary>
/// 一个具体实现Eat()方法的接口类,Eat()可能会有很多种,每一种都需要继承IEat接口,再重写Eat()方法。
/// </summary>
public class IEatSlow : IEat
{
    public void Eat()
    {
        Debug.Log("IEatSlow");
    }
}

/// <summary>
/// 另一种实现Eat()方法的接口类
/// </summary>
public class IEatSpeed : IEat
{
    public void Eat()
    {
        Debug.Log("IEatSpeed");
    }
}
  • 子类
using UnityEngine;
/// <summary>
/// 子类鸭子
/// </summary>
public class MallardDuck : Duck
{
    /// <summary>
    /// 必须override实现父类的抽象函数Quack()
    /// </summary>
    public override void Quack()
    {
        Debug.Log("Quack");
    }

    /// <summary>
    /// 构造函数中直接根据需要生成IEat的接口类
    /// </summary>
    public MallardDuck()
    {
        IEat = new IEatSlow();
    }
}
  • 调用类
using UnityEngine;
public class Main : MonoBehaviour
{
    void Start()
    {
        Duck duck = new MallardDuck();
        duck.Quack();
        duck.Swim();
        duck.Fly();
        duck.Eat();
    }
}

-最终输出结果

输出结果
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值