美文网首页
每日一学2——设计模式之策略模式

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

作者: ShawnWeasley | 来源:发表于2020-07-03 13:36 被阅读0次

学习来源: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();
    }
}

-最终输出结果


输出结果

相关文章

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

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

  • 简说设计模式之策略模式

    前言:对于设计模式基础概念可以去看[简说设计模式之设计模式概述] 一、什么是策略模式 策略(Strategy)模式...

  • PHP设计模式之策略模式

    PHP设计模式之策略模式

  • PHP设计模式之策略模式

    PHP设计模式之策略模式

  • 11.7设计模式-策略模式-详解

    设计模式-策略模式 策略模式详解 策略模式在android中的实际运用 1.策略模式详解 2.策略模式在andro...

  • 策略模式 2018-11-04

    设计模式之策略模式 官方说明设计模式的3个角色: 环境角色:context , 持有一个策略的引用 抽象策略角色,...

  • 策略模式

    参考资料:漫话:如何给女朋友解释什么是策略模式? 设计模式之策略模式(实例+Demo) Java设计模式(8)——...

  • 学习Head First设计模式Day1

    Java设计模式之设计模式 策略模式:策略模式定义了算法簇,分别封装起来,让他们之间可以互相替换,此设计模式让算法...

  • Java设计模式——策略模式

    Java设计模式之策略模式 这期分享的模式是策略模式是程序设计中最常用的了,因为开发工作中总是会使用到策略模式。 ...

  • 策略模式

    本文参考自: 《JAVA设计模式》之策略模式(Strategy) 1. 作用 策略模式属于对象的行为模式。其用意是...

网友评论

      本文标题:每日一学2——设计模式之策略模式

      本文链接:https://www.haomeiwen.com/subject/bbksqktx.html