본문 바로가기
STUDY/디자인패턴

Iterator 이터레이터 패턴

by 램플릿 2024. 7. 19.

 

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

namespace _20240719 {
// Iterator 인터페이스
    public interface IIterator<T>
    {
        bool HasNext();
        T Next();
    }

    // Iterable 인터페이스
    public interface IIterable<T>
    {
        IIterator<T> GetIterator();
    }

    // 구체적인 Iterable 클래스: 게임 레벨
    public class GameLevel : IIterable<GameObject>
    {
        private List<GameObject> enemies = new List<GameObject>();

        public void AddEnemy(GameObject enemy)
        {
            enemies.Add(enemy);
        }

        public IIterator<GameObject> GetIterator()
        {
            return new EnemyIterator(this);
        }

        // 구체적인 Iterator 클래스
        private class EnemyIterator : IIterator<GameObject>
        {
            private GameLevel level;
            private int index = 0;

            public EnemyIterator(GameLevel level)
            {
                this.level = level;
            }

            public bool HasNext()
            {
                return index < level.enemies.Count;
            }

            public GameObject Next()
            {
                if (HasNext())
                {
                    return level.enemies[index++];
                }

                return null;
            }
        }
    }

    // 반복자 패턴 사용 예시
    public class GameManager : MonoBehaviour
    {
        private GameLevel currentLevel;

        void Start()
        {
            // 게임 레벨 초기화 및 적 추가
            currentLevel = new GameLevel();
            currentLevel.AddEnemy(CreateEnemy("Enemy1"));
            currentLevel.AddEnemy(CreateEnemy("Enemy2"));
            currentLevel.AddEnemy(CreateEnemy("Enemy3"));

            List<GameObject> list = new();
            list.Add(CreateEnemy("Enemy4"));
            list.Add(CreateEnemy("Enemy5"));
            list.Add(CreateEnemy("Enemy6"));
            list.Add(CreateEnemy("Enemy7"));

            foreach (var o in list)
            {
                DealDamage(o);
            }
            
            // 반복자를 사용하여 모든 적에게 데미지 주기
            IIterator<GameObject> iterator = currentLevel.GetIterator();
            while (iterator.HasNext())
            {
                GameObject enemy = iterator.Next();
                DealDamage(enemy);
            }
        }

        private GameObject CreateEnemy(string name)
        {
            GameObject enemy = new GameObject(name);
            enemy.AddComponent<Enemy>();
            return enemy;
        }

        private void DealDamage(GameObject enemy)
        {
            Enemy enemyComponent = enemy.GetComponent<Enemy>();
            if (enemyComponent != null)
            {
                enemyComponent.TakeDamage(10);
                Debug.Log($"Dealt damage to {enemy.name}. Current health: {enemyComponent.Health}");
            }
        }
    }

    // 간단한 적 클래스
    public class Enemy : MonoBehaviour
    {
        public int Health { get; private set; } = 100;

        public void TakeDamage(int amount)
        {
            Health -= amount;
            if (Health <= 0)
            {
                Health = 0;
                Debug.Log($"{gameObject.name} is defeated!");
            }
        }
    }
}

'STUDY > 디자인패턴' 카테고리의 다른 글

Mediator 메디에이터 패턴  (0) 2024.07.19
Memento 메멘토 패턴 ★  (0) 2024.07.19
Strategy 전략 패턴  (0) 2024.07.19
Observer 옵저버 패턴 ★★★  (0) 2024.07.19
FSM(Finite-State-Machine) ★★★  (0) 2024.07.17