设计模式丨策略模式

2024-08-15 16:44:16 浏览数 (2)

大家好,我是SKODE。 小提示:选中左侧目录,可快速找到所需内容

本系列博客地址:传送门

一、策略模式

1、与工厂模式对比:

相同点:

都是实现了分工,一个人写逻辑,一个人使用这个逻辑。

不同点:

工厂模式的逻辑,是New对象

策略模式的逻辑,是处理策略。根据输入的不同,返回不同的结果。

2、什么时候用:

如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

3、策略模式的好处:

1、针对一组算法,将每一个算法封装到具有共同接口的独立的类中,使得它们可以互相替换。

2、符合OCP原则,即对扩展开放,对修改关闭的原则。

3、修改时只拓展算法,对其他算法,不做修改。

若是Switch Case语句,则不仅需要修改增加的case,还要改输入的传入的数据

4、如果不使用策略模式,那么使用算法或行为的环境类就可能会有一些子类(Switch Case),每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。

5、可以实现分工,调用的接口端和算法端可分开写。定义好接口API后,算法端可由多个程序员,根据这个API一起完成。参考王者荣耀实现释放技能:

a、定义释放技能的虚函数

b、定义每个英雄释放技能的覆写函数:可不断拓展

c、定义客户使用算法:英雄施放技能

这样换到新的场景后,策略模式只要拓展算法,便可以继续使用了。

二、Unity实际应用

代码展示:

代码语言:javascript复制
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    void Start()
    {
        //执行虚函数的函数
        CaculateStarge myCaculate = new CaculateStarge();

        //虚函数的覆写函数
        PersonStrage tmpPerson = new PersonStrage(20000);
        //给执行虚函数的函数,传入函数(实参,传入,为覆写函数)(形参,声明,用虚函数声明)。
        //因为覆写函数都继承了虚函数的API,因此,在执行虚函数的函数里,调用声明的虚函数内的
        //API(实际传入的为覆写函数),来执行覆写函数内的API。
        //用虚函数调用,优处是,通过虚函数内一个API,却能执行不同的覆写函数逻辑。
        myCaculate.CaculateStage(tmpPerson);

        CompananyStrage tmpCompaney = new CompananyStrage(20000);
        myCaculate.CaculateStage(tmpCompaney);
    }
}

//虚函数
public class StrageBase
{
    public virtual void Caculate()
    {
    }
}

//虚函数的覆写函数
public class PersonStrage : StrageBase
{
    float myTax;

    public PersonStrage(float tmpTax)
    {
        myTax = tmpTax;
    }
    public override void Caculate()
    {
        myTax = myTax * 0.1f;
        Debug.Log("PersonStrage=="   myTax);
    }
}

//虚函数的覆写函数
public class CompananyStrage : StrageBase
{
    float myTax;
    public CompananyStrage(float tax)
    {
        myTax = tax;
    }

    public override void Caculate()
    {
        myTax = myTax * 0.3f;
        Debug.Log("CompananyStrage=="   myTax);
    }
}

//执行虚函数的函数
public class CaculateStarge
{
    public void CaculateStage(StrageBase tmpStarge)
    {
        tmpStarge.Caculate();
    }
}

一起进步

我是SKODE

0 人点赞