다른 유사한 구조와 비교할 때 Iterator를 특별하게 만드는 것이 무엇인지 궁금해했으며 Gang of Four가 그것을 디자인 패턴으로 나열했습니다.
반복자는 다형성 (공통 인터페이스를 가진 컬렉션의 계층)과 우려의 분리를 기반으로합니다 (컬렉션에 대한 반복은 데이터의 구성 방식과 독립적이어야 함).
그러나 컬렉션 계층을 예를 들어 수학 객체 (정수, 부동 소수점, 복소수, 행렬 등)의 계층과 이러한 객체에 대한 일부 관련 작업 (예 : 전원 함수)을 나타내는 클래스로 반복자를 대체하면 어떻게 될까요? 클래스 다이어그램은 동일합니다.
우리는 아마도 Writer, Painter, Encoder와 같은 더 많은 유사한 예제를 찾을 수있을 것입니다. 그러나 나는 이것들 중 어떤 것도 디자인 패턴이라고 들었습니다.
그렇다면 Iterator가 특별한 이유는 무엇입니까?
컬렉션 내에 현재 위치를 저장하기 위해 변경 가능한 상태가 필요하기 때문에 더 복잡하다는 사실입니까? 그러나 변경 가능한 상태는 일반적으로 바람직하지 않은 것으로 간주됩니다.
요점을 명확히하기 위해 좀 더 자세한 예를 들어 보겠습니다.
디자인 문제는 다음과 같습니다.
클래스의 계층 구조와이 클래스의 객체에 정의 된 작업이 있다고 가정 해 봅시다. 이 작업의 인터페이스는 각 클래스마다 동일하지만 구현 방법이 완전히 다를 수 있습니다. 또한 다른 매개 변수를 사용하여 동일한 객체에 작업을 여러 번 적용하는 것이 합리적이라고 가정합니다.
다음은 디자인 문제에 대한 합리적인 해결책입니다 (실제로 반복자 패턴의 일반화).
우려를 분리하기 위해 작업 구현을 원래 클래스 계층 (오퍼랜드 개체)에 함수로 추가해서는 안됩니다. 동일한 피연산자에 연산을 여러 번 적용하려고하므로 함수가 아니라 피연산자에 대한 참조를 보유하는 객체로 표시되어야합니다. 따라서 피연산자 객체는 작업을 나타내는 객체를 반환하는 함수를 제공해야합니다. 이 객체는 실제 작업을 수행하는 기능을 제공합니다.
예를 들면 :
MathObject
파생 클래스 MyInteger
와 와 기본 클래스 또는 인터페이스 (어리석은 이름, 누군가가 더 나은 아이디어를 가지고 있습니다.)가 있습니다 MyMatrix
. 각각에 대해 정사각형, 큐브 등의 계산을 허용 MathObject
하는 작업 Power
을 정의해야합니다. 그래서 우리는 (Java로) 쓸 수 있습니다 :
MathObject i = new MyInteger(5);
Power powerOfFive = i.getPower();
MyInteger square = powerOfFive.calculate(2); // should return 25
MyInteger cube = powerOfFive.calculate(3); // should return 125