달력

62025  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

Observer Pattern

Design Patterns 2009. 11. 11. 18:47

Observer Pattern
뭔가 중요한 일이 일어났을 때 객체들한테 새 소식을 알려줄 수 있는 패턴이다. 객체 쪽에서는 계속해서 정보를 받을지 여부를 실행 중에 결정할 수 있다.

 

1. Observer Pattern의 정의
Observer Pattern이란 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many)의존성을 정의한다.

 2. Observer Pattern의 특징
옵저버 패턴에서는 주제와 옵저버에 의해 일대다 관계를 정의된다. 옵저버는 주제객체에 의존하기 때문에 주제객체의 상태가 바뀌면 주제객체에 의존하는 모든 옵저버 객체에게 연락이 간다. 연락 방법에 따라 옵저버에 있는 값이 새로운 값으로 갱신될 수도 있다. Observer Pattern을 구현하는 방법에는 여러 가지가 있지만, 대부분 주제(subject)인터페이스와 옵저버(observer)인터페이스가 들어있는 클래스 디자인을 바탕으로 한다.



  • Observer란 관찰자 이다.
  • Observer Pattern은 상태 값이 변하는 Subject의 값을 체크하기 위해 생겨났다.
  • Publish subscribe패턴이라고 불리우기도 한다. 컨텐츠 발행자(Subject)가 컨텐츠의 변화가 생겼을 때 구독자(Observer)에게 알려주는 방식과 비슷하기 때문이다.
  • Observer는 2개 이상 존재 할 수 있다. 1:N
  • Observer가 취하는 값은 읽기 전용으로 간주한다.

3. Observer Pattern의 클래스 다이어그램
? 주제(subject) : 데이터가 바뀌면 새로운 데이터 값을 옵저버들에게 보내 주는 객체
? 옵저버(observer) : 주제의 데이터가 변경되면 갱신내용을 받는 객체

  

 4. Observer Pattern의 구성
A. 주제를 나타내는 subject 인터페이스 객체에서 옵저버로 등록하거나 옵저버 목록에서 탈퇴하고 싶을 때는 이 인터페이스에 있는 메소드를 사용한다.
B. 옵저버가 될 가능성이 있는 객체에서는 반드시 observer 인터페이스를 구현해야 한다. 이 인터페이스에는 주제의 상태가 바뀌었을 때 호출되는 메소드가 있다.
C. 주제 역할을 하는 구상 클래스에서는 항상 subject인터페이스를 구현해야 한다. 주제 클래스에서는 등록 및 해지를 위한 메소드 외에 상태가 바뀔 때마다 모든 옵저버들에게 연락하기 위한 메소드도 구현해야 한다.
D. Observer 인터페이스만 구현한다면 무엇이든 옵저버 클래스가 될 수 있다. 각 옵저버는 특정 주제 객체에 등록을 해서 연락을 받을 수 있다.

 5. Observer Pattern에서 느슨한 결합(Loose Coupling)의 위력
옵저버 패턴에서는 주제와 옵저버가 느슨하게 결합되어 있는 개체 디자인을 제공한다. 두 객체가 느슨하게 결합되어 있다는 것은 그 둘이 상호작용을 하긴 하지만 서로에 대해 잘 모른다는 것을 의미한다. 주제가 옵저버에 대해서 아는 것은 옵저버가 특정 인터페이스를 구현 한다는 것뿐이며, 옵저버는 언제든지 새로 추가하거나 제거 할 수 있다. 새로운 형식의 옵저버를 추가하려고 할 때도 주제를 전혀 변경할 필요가 없으며, 주제와 옵저버는 서로 독립적으로 재사용할 수 있다. 주제나 옵저버가 바뀌더라도 서로한테 영향을 미치지는 않는다. 이런 관계를 느슨한 결합이라고 하며 느슨하게 결합하는 디자인을 사용하면 변경 사항이 생겨도 무난히 처리할 수 있는 유연한 객체지향 시스템을 구출할 수 있다. 객체 사이의 상호의존성을 최소화할 수 있기 때문이다.

6. 주제가 옵저버한테 상태 정보를 전달하는 두 가지 방식
주제가 옵저버한테 상태 정보를 전달하는 방식에는 두 가지가 있다. 주제객체에서 데이터를 보내는 방식인 푸시방식과 옵저버가 데이터를 가져오는 방식인 풀 방식이 있다. 두 가지 방식 중에는 풀 방식을 더 옳은 것으로 간주한다.



옵저버 패턴에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의합니다.

'Design Patterns' 카테고리의 다른 글

스트래티지 패턴 2 (Head First 파헤치기 ver.1)  (0) 2009.11.12
스트래티지 패턴(Strategy Pattern)  (0) 2009.11.12
Singleton Pattern -  (0) 2009.11.11
생성 패턴-Factory  (0) 2009.11.11
패턴의 정의 JSTOM  (0) 2009.11.11
Posted by 인천총각
|

Singleton Pattern -

Design Patterns 2009. 11. 11. 17:03

Singleton Pattern : 하나의 클래스 당 오직 하나의 인스턴스 만을 가지고 작업하고 인스턴스를 제어하는 단 하나의 방법만을 제공하고자 할 때 유용하다!!!
둘 이상의 인스턴스가 생성되는 것을 막기위해 클래스의 생성자를 private으로 정의하고 그 클래스의 static 메소드를 만들어서 오직 그 메소드를 통해서만 생성자에 접근할 수 있도록 하는 것이다. 그럼 이제 클래스가 이미 인스턴스화 되어 있으면 널값을 반환하고 그렇지않으면 Spooler의 인스턴스를 반환하는 메소드를 가진 Spooler클래스를 제작해보자.

------------------------------------------------------------------------------------------------------------------------
public class PrintSpooler{
//a prototype for a spooler class
//such that only one 인스턴스 can ever exist
private static PrintSpooler spooler;
private PrintSpooler(){ //privatized
}
//return only one spooler 인스턴스
public static synchronized PrintSpooler getSpooler(){
if(spooler == null) //if none created
spooler = new PrintSpooler(); //create one
return spooler;
}
public void print(String s){
System.out.println(s);
}
}
------------------------------------------------------------------------------------------------------------------------
private으로 선언되었기 때문에 Spooler클래스의 인스턴스를 직접생성할 수 없다.
------------------------------------------------------------------------------------------------------------------------
예외 던지기-
1-----------------------------------------------------------------------------------------------------------------------

public class Spooler{
// printer스풀 클래스를 위한 원형
static boolean instance_flag=false;
public Spooler() throws SingletonException{
if(instance_flag) throw new SingletonException("Only oneallowed");
else instance_flag=true;
System.out.println("printer가 열렸습니다.");
}
}

2-----------------------------------------------------------------------------------------------------------------------

public class singleSpooler{
static public void main(String argv[]){
Spooler pr1,pr2;
// 한개의 프린터를 열것이다.
System.out.println("하나의 스풀러를 열고있습니다.");
Try{
pr1=new Spooler();
}catch(SingletonException e)System.out.println(e.getMessage());
// 다른 하나의 프린터를 열려한다. 실패할 것이다.
System.out.println("두개의 스풀러를 열려합니다.");
Try{
pr2=new Spooler();
}catch(SingletonException e)System.out.println(e.getMessage());
}
}

결과--------------------------------------------------------------------------------------------------------------------

하나의 스풀러를 열고 있습니다.
printer가 열렸습니다.
두개의 스풀러를 열려 합니다.
Only one allowed
마지막 줄에서 두개의 스풀러를 사용하려는 것에 대해 예외처리를 하였다.

------------------------------------------------------------------------------------------------------------------------
Singleton ???
1. Singleton의 상속은 기초 Singleton클래스가 인스턴트화되지 않기 때문에 어려울 것이다.
2. 하나이상의 인스턴스를 허용할 수 있도록 Singleton을 변경할 수 있다.

'Design Patterns' 카테고리의 다른 글

스트래티지 패턴 2 (Head First 파헤치기 ver.1)  (0) 2009.11.12
스트래티지 패턴(Strategy Pattern)  (0) 2009.11.12
Observer Pattern  (0) 2009.11.11
생성 패턴-Factory  (0) 2009.11.11
패턴의 정의 JSTOM  (0) 2009.11.11
Posted by 인천총각
|

Creational pattern(생성 패턴) :

객체의 인스턴스를 생성하는 방법, 프로그래머는 어떻게 객체를 생성하고 배열할지 신경 쓸 필요가 없다

========================================================================================================================


?? Factory Method 패턴 : Factory Method 패턴은 입력 데이터에따라 abstract한 부모 클래스의 여러 서브클래스 중 어떤 것을
반환할지를 결정하는 간단한 클래스를 제공한다. 여러 factory패턴들의 기초로써 Simple Factory 패턴을 우선 살펴볼 것이며,
그리고 나서 Factory Method 패턴을 소개할 것이다.

?? Abstract Factory 패턴 : Abstract Factory 패턴은 관련된 객체들의 여러 묶음(family) 중 하나를 생성하고 반환하는 인터페이스
를 제공한다.

?? Builder 패턴 : Builder 패턴은 복잡한 객체의 생성을 표현(representation)과 분리함으로써, 프로그램의 필요에 따라 여러
다른 표현(representation)이 생성될 수 있도록 해준다.

?? Prototype 패턴 : Prototype 패턴은 새로운 인스턴스를 복사하거나 복제하는 인스턴스화된 클래스를 제공한다. 이러한 인스턴
스는 public 메소드를 사용하여 가공될(tailor) 수 있다.

?? Singleton 패턴 : Singleton 패턴은 하나 이상의 인스턴스가 생성되지 않는 클래스를 말한다. Singleton 패턴은 이러한 인스턴스
에 접근하기 위한 하나의 포괄적인(global) 접근 포인트를 제공한다.

------------------------------------------------------------------------------------------------------------------------

Simple Factory- ex) Factory클래스에서 조건여부 판단하여 두 클래스중 하나의 클래스를 선택해 인스턴스를 반환하는 방법!!
여러 개의 클래스 중 반환할 클 래스를 결정하고 그 클래스를 반환하는 상위 추상(abstraction)클래스를 생성할 수 있다.
그러면 당신은 실제로 당신이 어떤 서브클래스를 사용할지 알 필요 없이 그 클래스 인스턴스의 메소드를 호출할 수 있다.


public class NameFactory {
Namer namer;
// Factory는 쉼표의 유무에 기초해 어떤 클래스가
// 반환될 것인지 결정한다.
public Namer getNamer(String entry) {
//comma determines name order
int i = entry.indexOf(",");
if (i > 0)
return new LastFirst(entry);
else
return new FirstFirst(entry);
}
}
------------------------------------------------------------------------------------------------------------------------

factory 클래스는 교통경찰 같은 역할을 하며, 한 계층의 서브클래스 중 어떤 것이 인스턴스화 될것인지를 결정할 것이다.

------------------------------------------------------------------------------------------------------------------------

Factory Method 패턴은 여러 면에서 쓸모가 많지만, 어떤 서브클래스를 인스턴스화할 것인지를 결정하는 클래스가 없다는 점에서 약간은 난해하다. 슈퍼클래스(superclass)는 이러한 문제에 대한 결정을 서브클래스에게 맡긴다.
패턴에서는 여러 서브클래스들 중 하나의 서브클래스를 선택해 인스턴스화하는 루틴이 존재하지 않는다. 대신에 Factory Method 패턴을 사용한 프로그램은 abstract 클래스를 이용하여 이 문제를 해결한다.
이 abstract 클래스는 객체를 생성하는 틀만을 제공하며 어떤 객체를 생성할 것인 가는 각각의 서브클래스가 결정한다.

------------------------------------------------------------------------------------------------------------------------

다음의 상황에서 Factory 메소드 사용을 고려해야 한다

?? 클래스가 생성해야 하는 객체의 클래스의 종류를 예상할 수 없을 경우

?? 클래스가 자신이 생성하는 객체를 명확히 하기 위해서 서브클래스를 사용할  경우 어떤 클래스가 생성되었는가에 대한 정보를 국한시키기 위해서 부모(base) 클래스는 abstract이고 패턴은 완전히 작동하는(working) 클래스를반환한다.

?? 부모 클래스는 디폴트 메소드를 포함하고, 디폴트 메소드가 불충분할 때는 서브클래스에서 메소드를 추가한다.

?? 여러 클래스 타입 중 어떤 클래스가 반환될 것인지 알려주는 파라미터 들이 factory에 넘겨진다.

이런 경우 클래스들은 같은 메소드 이름을 공유하지만 각각 매우 다른 무언가를 수행할 것이다.

'Design Patterns' 카테고리의 다른 글

스트래티지 패턴 2 (Head First 파헤치기 ver.1)  (0) 2009.11.12
스트래티지 패턴(Strategy Pattern)  (0) 2009.11.12
Observer Pattern  (0) 2009.11.11
Singleton Pattern -  (0) 2009.11.11
패턴의 정의 JSTOM  (0) 2009.11.11
Posted by 인천총각
|