'프로그래밍 > 디자인패턴' 카테고리의 다른 글
디자인패턴요약 (0) | 2018.06.11 |
---|---|
디자인 패턴 요약 (0) | 2018.06.11 |
쉽게 배우는 Template 패턴 (0) | 2017.01.29 |
쉽게 배우는 Builder 패턴 (0) | 2017.01.29 |
쉽게 배우는 Adapter 패턴 (아답터 패턴) (0) | 2017.01.29 |
디자인패턴요약 (0) | 2018.06.11 |
---|---|
디자인 패턴 요약 (0) | 2018.06.11 |
쉽게 배우는 Template 패턴 (0) | 2017.01.29 |
쉽게 배우는 Builder 패턴 (0) | 2017.01.29 |
쉽게 배우는 Adapter 패턴 (아답터 패턴) (0) | 2017.01.29 |
GoF(Gang of Four)에서는 23가지 디자인 패턴을 3가지 유형으로 분류합니다.
주요 디자인 패턴만 정리했습니다.
Class Diagram
구현 및 Code
public interface Observer { public abstract void update(NumberGenerator generator); }
import java.util.Vector; import java.util.Iterator; public abstract class NumberGenerator { private Vector observers = new Vector(); // Observer들을 보관 public void addObserver(Observer observer) { // Observer를 추가 observers.add(observer); } public void deleteObserver(Observer observer) { // Observer를 삭제 observers.remove(observer); } public void notifyObservers() { // Observer에 통지 Iterator it = observers.iterator(); while (it.hasNext()) { Observer o = (Observer) it.next(); o.update(this); } } public abstract int getNumber(); // 수를 취득한다. public abstract void execute(); // 수를 생성한다. }
import java.util.Random; public class RandomNumberGenerator extends NumberGenerator { private Random random = new Random(); // 난수발생기 private int number; // 현재의 수 public int getNumber() { // 수를 취득한다. return number; } public void execute() { for (int i = 0; i < 20; i++) { number = random.nextInt(50); notifyObservers(); } } }
public class DigitObserver implements Observer { public void update(NumberGenerator generator) { System.out.println("DigitObserver:" + generator.getNumber()); try { Thread.sleep(100); } catch (InterruptedException e) { } } }
public class GraphObserver implements Observer { public void update(NumberGenerator generator) { System.out.print("GraphObserver:"); int count = generator.getNumber(); for (int i = 0; i < count; i++) { System.out.print("*"); } System.out.println(""); try { Thread.sleep(100); } catch (InterruptedException e) { } } }
public class Main { public static void main(String[] args) { NumberGenerator generator = new RandomNumberGenerator(); Observer observer1 = new DigitObserver(); Observer observer2 = new GraphObserver(); generator.addObserver(observer1); generator.addObserver(observer2); generator.execute(); } }
디자인패턴 요약 (0) | 2018.06.11 |
---|---|
디자인 패턴 요약 (0) | 2018.06.11 |
쉽게 배우는 Template 패턴 (0) | 2017.01.29 |
쉽게 배우는 Builder 패턴 (0) | 2017.01.29 |
쉽게 배우는 Adapter 패턴 (아답터 패턴) (0) | 2017.01.29 |
1. iterator 패턴이란
개발을 하면서 array나 List, Set, Map과 같은 interface 들을 많이 사용합니다. 이것들의 특징은 어떤 데이터들의 집합체라는 겁니다.
원래 집합체란 게 속에 뭐가 들었냐가 중요하죠.
그래서 집합체들을 다룰 때는 얘들이 가지고 있는 개별 원소에 대해서 이런 저런 작업들을 할 일이 많습니다.
iterator를 쓰게 되면, 집합체와 개별 원소들간에 분리시켜 생각할 수가 있습니다. 심지어는 그 집합체가 어떤 클래스의 인스턴스인지 조차 신경쓰지 않아도 됩니다.
2. 예제
// iterator 인터페이스를 만든다.3. Iterator관련 interface
iterator 인터페이스를 만드는 대신에 구현되어 있는 java 의 iterable 인터페이스를 사용해도 됩니다.
private class NameIterator implements Iterable<String> {
위와같은 식으로 구현되어 있는걸 사용해도 되지만 iterator 패턴이 어떤건지 알기 위하여 구현을 임의로 한것입니다.
4. JAVA API에 있는 Iterator
우리가 알고 있는 일반적인 집합체들은 전부 Iterator를 제공합니다. Set, List 등은 Collection 을 상속 받는데, Collection이 Iteratable을 상속 받기 때문입니다.
위에서 청록색 부분을 list.iterator() 라고 쭐여버려도 됩니다. 걍 있는 거 안 쓰고 굳이 구현한 건 예제 파일을 함 보여줄라고 한 겁니다. 사실은 예제 전체가 억지로 만들어낸 겁니다. 일반적인 집합체를 구현해서 쓰는 일은 거의 없고, JDK 안에 들어 있는 애들을 가져다 쓰는데, 걔들은 거의 대부분 Iterator를 제공하거든요.(Map은 한 다리 건너서 제공합니다.) 그래서 Iterator를 직접 구현할 일은 거의 없습니다. 가져다가 쓸 일이 있을 뿐이죠.
이제 Map은 왜 Iterator를 제공하지 않는 지를 살펴보죠. Map은 Set이나 List와는 달리 key-value의 구조입니다. key에 대한 Iterator인지 value에 대한 Iterator인지 구별할 방법이 없죠. 그래서 아예 제공을 안 합니다. 그러나 Map에는 key에 대해서는 Set<K> keySet()이라는 key를 Set으로 가져오기를 지원하고, value에 대해서는 Collection<V> values() 를 제공합니다. 위에서 말씀드렸다시피 Set과 Collection은 둘다 Iterator를 제공합니다.
쉽게 배우는 Builder 패턴 (0) | 2017.01.29 |
---|---|
쉽게 배우는 Adapter 패턴 (아답터 패턴) (0) | 2017.01.29 |
쉽게 배우는 Factory 패턴 (팩토리 패턴) (0) | 2017.01.28 |
디자인 패턴의 간략한 암기 (0) | 2017.01.21 |
factory pattern vs abstract pattern (0) | 2016.09.01 |
1. Factory 패턴 이란
아주 중요한 패턴중에 하나 입니다. Factory 패턴은 creational pattern 에 속하는 패턴입니다.
Factory 패턴은 객체생성로직 없이 객체를 만들어 내는 패턴입니다.. 인터페이스를 통해 만들어진 객체를 참조 하죠.
쉽게 설명해드리겠습니다. factory 는 한국어로 공장이란 뜻이죠. 즉 객체를 만들어내는 공장 입니다.
객체 선언은 보통 new 객체() 이런식으로 하죠. factory는 내부에서 그런 일을 해줍니다. 즉 factory를 가져다가 쓰는 부분에서는 new 객체()와 같은 식으로 변수를 선언할 필요가 없습니다. Abstract class나 인터페이스에 대해서 다양한 하위 구현체가 있을 경우에 사용하면 좋습니다. 사용법은 Factory.create(인자는 맘대로) 와 같이 됩니다.
실무에서 자주 쓰이는 패턴중 하나이니 아래와 같이 천천히 따라해보도록 하죠.
2. 따라하기
// animal 인터페이스를 만듭니다. 기본이 되는 interface 죠. 모든 디자인 패턴은 interface 를 사용한다 해도 과언이 아닙니다.
// Cat 클래스를 만듭니다.
// Cow 클래스를 만듭니다.
// Dog 클래스를 만듭니다.
// animal 을 만들어내는 AnimalFactory 클래스를 만든다.
//( 이 class 가 핵심 입니다. factory 패턴을 구현한곳이죠. 이해하기 힘드시다면 이 class 만 30번 보시면 이해가 되실겁니다.)
// 자 테스트를 한번 해볼까요.
3. Factory 의 이해
위의 결과와 같이 Animal interface 를 이용해서 각자 다른 소리를 내는 3개의 클래스를 만들어 봤습니다.
AnimalFactory 클래스에서는 각 동물들의 이름을 받아서 클래스를 만들어 냈습니다. 즉 팩토리 패턴을 구현해 놓은 클래스 입니다.
테스트를 실행하는 main 클래스 안에는 new 라는 구문 자체가 없습니다 팩토리 패턴은. 정확히 어떤 클래스의 인스턴스인지 신경쓰지 않고 구현할 수 있는 장점이 있습니다. 객체 타입이 굉장히 유연해 질 수 있죠.
이것으로 아주 쉽게 배우는 factory 패턴을 마치고자 합니다.
쉽게 배우는 Adapter 패턴 (아답터 패턴) (0) | 2017.01.29 |
---|---|
쉽게 배우는 Iterator 패턴 (이터레이터 패턴) (0) | 2017.01.29 |
디자인 패턴의 간략한 암기 (0) | 2017.01.21 |
factory pattern vs abstract pattern (0) | 2016.09.01 |
자바 에서 쓰이는 디자인 패턴들 (0) | 2016.08.26 |
Iterator, Enumeration은 둘다 모두 자바에서 제공하는 컬렉션에 대해 각 컬렉션의 항목들을 순차적으로 접근하는데 사용한다.
차이점은 Enumeration의 경우 자바의 초기버젼에서 개발되었습니다. 자바는 jdk1.2, 즉 자바2에서 많은 변화가 생겼는데, 그중에 하나가 컬렉션 클래스(Vector, List, Map, Set...)들을 컬렉션프레임웍 이라는것으로 관리하는것이다.
이때, 컬렉션프레임웍에서는 Iterator라고 해서, Enumeration의 기능을 확장해서, Collection인터페이스를 상속받은 모든 컬렉션(List, Set, Vector.)에서 Enumeration을 사용가능하게 하였다.
정리하면, Enumeration는 자바초기버젼에서 제공되는것으로 Hashtable, Vector 에서 사용가능하다. Iterator는 jdk1.2에서 제공되는 것으로 Collection인터페이스를 구현상속한 모든 컬렉션 클래스에서 사용가능하다.
덧붙여서, Iterator는 remove()라는 메소드가 존재하여서, 원본 컬렉션의 항목을 삭제할수 있습니다.
예를 들면,
//Enumeration 사용법
Vector v = new Vector();
...
Enumeration e = v.elements();
while(e.hasMoreElements())
{
//항목들을 모두 콘솔창에 출력합니다.
System.out.println((String)e.nextElement());
}
//Iterator 사용법
HashSet set = new HashSet();
...
Iterator iter = set.iterator();
while (iter.hasNext()) {
i++;
//항목들을 모두 콘솔창에 출력합니다.
System.out.println(i + ":" + iter.next());
}