一、策略模式(Unity3d演示)

     项目文件下载地址:http://download.csdn.net/detail/wowkk/5904767

     我的微薄:http://weibo.com/u/2448939884 欢迎程序员互粉。

    先学设计模式还是先学数据结构或算法?我还是选择前者。兴趣在应用层呵呵。

    不久前我还以为三层架构也是设计模式中的一种,现在才知道,开发模式和设计模式是不一样的。

    就我目前接触过的项目,基本都采用简单三层架构,最多加上工厂模式。感觉三层架构就像是“万金油”,哪里都能运用上,那为什么还要用到设计模式呢~我知道这肯是因为我碰到的场景不多。为了多点设计想法、多点学习英语,《head+first+设计模式》中英文一起看!

 
    策略模式(The Strategy pattern)
    设计模式中的策略模式是什么?要怎样应用策略模式?看看我的理解对不对吧^_^Unity3d游戏引擎演示。
    前半部分对策略模式的理解需要一些多态基础。 后部分的演示需要Unity3d基础(写了一些关于Unity3d的教程了,以后成熟了再发吧。)
   
    定义:定义算法族,分别封装起来,让它们之前可以互相替换,此模式让算法的变化独立于使用算法的客户。
    场景:有一个游戏,游戏里有一个池塘,池塘里有一堆鸭子。有各种各样的鸭子,它们都继承自同一个基类,各自重写了基类的一些功能。以前,鸭子都会游,不同鸭子会有不同的叫声(多态Polymorphism)。现在,突然要给一些鸭子添加“飞”的功能。如果像以前那样,在基类实现“飞”的功能,那所有鸭子都会飞了。如果给不要飞的鸭子重写“飞”的函数让它不会飞或者只给要飞的鸭子写“飞”的功能,那将丢失代码的可重用性(Reuse)。

    策略模式将对象模型(Model)与对象的一些经常变动的行为(Behaviour)进行分离,将原有的“Is-A”(是一个类)模式改为“Has-A”(类包含类)模式。

    行为类,比如飞,也有一个共同接口(Interface)(相当于纯虚类?)。需要的话,可以多态成多种多样的飞行类。

    在对象模型里,比如鸭子。封装(Encapsulation)了一个飞行接口,然后在构造函数里,对这个接口进行实例化(Instantiase),让鸭子具有某种飞的功能。之后,给鸭子一个飞的方法,调用接口飞的行为,让鸭子飞起来。

    这样,我们在应用层中,实例化一个鸭子模型,需要飞时,直接使用该模型的飞方法即可。

    这是策略模式一个强大的优点。相对于普通的面向对象设计(Object - Oriented),大大提高代码的可重用性。

    另外一个优点,就是可以在程序运行时,改变对象模型的行为。只需要给模型写一个 setBehavior(NewBehavior n){替换将私有的行为变量;}方法,这样,就算新设计的飞行行为,也可以很迅速的分配给任何模型。

    下面试下能否利用unity3d来演示。(在我的理解中,其实游戏引擎已经完全做到了这一点!导入一个模型,里面的“动画组件”就是行为分离。需要让模型进行某些动作,只需要在“动画组件”里进行设计,然后赋给模型即可!)

    我专门找了一个鸭子模型:
   
    为了测试方便,就不使用鸭子模型继承了。
    首先创建一个飞行接口:
public interface IFly

	 {

        void Fly(GameObject g); //GameObject参数指的是“鸭子”

	 }

   
    以后新添加的飞行类型都继承自该接口。比如这里的“垂直上飞”行为
   
public class Fly1:IFly

	 {

        //让物体垂直向上飞

        void IFly.Fly(GameObject g) {

            g.transform.Translate(0, 1 * Time.deltaTime, 0, Space.Self);

        }

	 }

 

	public class Fly2:IFly
	{
        //45度向前飞行
        void IFly.Fly(GameObject g) {
            g.transform.Translate(1 * Time.deltaTime, 1 * Time.deltaTime, 0, Space.Self);
        }
	}


 


    接着就是创建一个鸭子类了。
public class Duck {

    private GameObject duck;//鸭子模型(在构造函数中赋值)

    private IFly fly;//鸭子该如何飞?(在构造函数中初始化,或者在SetFlyBehavior()函数中设置)

    public Duck(GameObject g)

    {

        duck = g;

        fly = new Fly1();//多态的精髓!    
}

    //让鸭子飞

    public void Fly()

    {

        fly.Fly(duck);

    }

    //设置鸭子飞的方式

    public void SetFlyBehavior(IFly f) {

        fly = f;   

    }

}

    最后一个“类”,用来控制鸭子的。
   
public class Control : MonoBehaviour {

    public GameObject g;

    private Duck d;

	 // Use this for initialization

	 void Start () {

        d = new Duck(g);

	 }

	

	 // Update is called once per frame

	 void Update () {

        //按W键时飞行

        if (Input.GetKey(KeyCode.W)) {

            d.Fly();

        }

        //按空格键时改变飞行行为

        if (Input.GetKey(KeyCode.Space)) {

            d.SetFlyBehavior(new Fly2());

        }

	 }

}


    最后!把“控制类”扔给相机,然后把“鸭子模型”扔给“控制类”的GameObject g变量!搞定!
    CSDN博客不能传视频,就录制下GIF凑合下吧。(飞到中间的时候,我按了空格键,然后就改变的飞行方式)
    第一篇感觉较好的文章,希望得到指点与支持哈哈^_^
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值