using UnityEngine;
//苹果手机
public class IPhone : Config
{
public void Chip()
{
Debug.Log("使用A14芯片");
}
}
3️⃣ 具体产品:XiaoMi
using UnityEngine;
//小米手机
public class XiaoMi : Config
{
public virtual void Chip()
{
Debug.Log("使用高通芯片");
}
}
4️⃣ 工厂类:ConcreteProduct
public class ConcreteProduct
{
//生产工厂,供外部调用
public static Config Create(int id)
{
switch (id)
{
case 1:
return new XiaoMi();
case 2:
return new IPhone();
}
return null;
}
}
using UnityEngine;
public class IPhoneFactory : IFactory
{
public IConfig Create()
{
Debug.Log("这个工厂生产了 IPhoneAllConfig 配置的苹果手机");
return new IPhoneAllConfig();
}
}
3️⃣ 具象工厂:XiaoMiFactory
using UnityEngine;
public class XiaoMiFactory : IFactory
{
public IConfig Create()
{
Debug.Log("这个工厂生产了 XiaoMiAllConfig 配置的小米手机");
return new XiaoMiAllConfig();
}
}
迭代器模式
迭代器模式: 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
Unity中实现迭代器模式的API是 foreach。
但是,foreach可能不包含我们想要的功能,
下面,我们就来自己实现一个通用的迭代器。
使用方法是:
1、首先自己的迭代器继承基础脚本的类:IEnumerable,可覆写里面的方法。
2、接着就可以使用啦!
1️⃣ 基础类1:Iterator
using System.Collections.Generic;
public class Iterator : IteratorBase
{
private IList
2️⃣ 基础类2:IEnumerable
using System.Collections.Generic;
public interface IteratorBase
{
object Current { get; }
int Count { get; }
bool MoveNext();
///
/// 将当前指针移动到第一位
///
void Reset();
}
public class IEnumerable
{
private IList items = new List();
public virtual int Count => items.Count;
public virtual object this[int index]
{
get { return items[index]; }
set { items.Insert(index, value); }
}
public virtual IteratorBase GetIterator()
{
return new Iterator(items);
}
}
3️⃣ 迭代器示例:Group
继承IEnumerable就好,Group便已实现了迭代器模式
你可以重写、拓展你的迭代器,实现想要的功能
using UnityEngine;
public class Group : IEnumerable
{
public override IteratorBase GetIterator()
{
Debug.Log("你可以重写你的迭代器");
return base.GetIterator();
}
}
下面是最后一步,有的同学别睡觉,敲黑板
4️⃣ 使用示例:Test
using UnityEngine;
public class Test : MonoBehaviour
{
private void Start()
{
Group myGroup = new Group();
myGroup[0] = "s";
myGroup[0] = "k";
myGroup[0] = "o";
myGroup[0] = "d";
myGroup[0] = "e";
print(myGroup.Count);
IteratorBase iterator = myGroup.GetIterator();
print(iterator.Count);
while (iterator.MoveNext())
{
print("当前元素是:" + iterator.Current);
}
}
}
命令模式
命令模式是游戏中很有用的设计模式,书中有一句话是这样说的:
Encapsulate a request as an object, thereby letting users parameterize clients with different requests, queue or log requests, and support undoable operations. —《Design Patterns: Elements of Reusable Object-Oriented Software》
using UnityEngine;
public class BoxCommand : command
{
Vector3 _trans;
public BoxCommand(Vector3 m, float t)
{
_trans = m;
_time = t;
}
public override void Execute(BoxEntity avator)
{
avator.move(_trans);
}
public override void Undo(BoxEntity avator)
{
avator.move(-_trans);
}
}