본문 바로가기

java/디자인패턴

옵저버 패턴

옵저버 패턴


요즘 부쩍 말을 안듣는 두 아들들을 위해 아버지는 옵저버를 고용해 옵저버를 통해서 미션을 전달하여 수행 하도록 합니다.






클래스 다이어 그램입니다. 


OnesParents : 부모 인터페이스이며 아이들을 감시하기 위해 옵저버를 고용합니다. 옵저버가 관리하는 아이들 등록 및 삭제 인터페이스를 제공하며  아버지의 미션을 아이들에게 알리는 인터페이스를 제공 합니다.  


Father :  아버지는 부모 인터페이스를 구현하여 옵저버에게 미션을 전달 합니다.


ParentsObserver : 부모가 아이들에게 미션을 줄 때 필요한 미션을 받아서 아이들에게 알려줄수 있는 인터페이스를 제공합니다.


SeungJae :  승재는 아버지가 고용한 옵저버에게 미션을 받아 수행합니다.


SeungHyun : 승현이는 아버지가 고용한 옵저버에게 미션을 받아 수행합니다.



OnesParents.java

public interface OnesParents {
void add(ParentsObserver parentObserver);
void delete(ParentsObserver parentObserver);
void notifyParentsObserver(String action);
}


Father.java

public class Father implements OnesParents {
private List<ParentsObserver> parentsObservers = new ArrayList<>();

@Override
public void add(ParentsObserver parentObserver) {
parentsObservers.add(parentObserver);
}

@Override
public void delete(ParentsObserver parentObserver) {
parentsObservers.remove(parentObserver);
}

@Override
public void notifyParentsObserver(String action) {
for(ParentsObserver parentsObserver : parentsObservers) {
parentsObserver.fatherOrder(action);
}
}
}

ParentsObserver.java

public interface ParentsObserver {
void fatherOrder(String action);
}


SeungJae.java


public class SeungJae implements ParentsObserver {
private OnesParents onesParents;

public SeungJae(OnesParents onesParents) {
this.onesParents = onesParents;
onesParents.add(this);
}

public void prentDelete(OnesParents onesParents) {
onesParents.delete(this);
}

@Override
public void fatherOrder(String action) {
System.out.println("승재야 " + action);
sonResponse(true);
}

private void sonResponse(boolean yes) {
if (yes) {
System.out.println("네 아버지.");
} else {

}
}
}


SeungHyun.java


public class SeungHyun implements ParentsObserver {
private OnesParents onesParents;

public SeungHyun(OnesParents onesParents) {
this.onesParents = onesParents;
onesParents.add(this);
}

public void prentDelete(OnesParents onesParents) {
onesParents.delete(this);
}

@Override
public void fatherOrder(String action) {
System.out.println("승현아" + action);
sonResponse(true);
}

private void sonResponse(boolean yes) {
if (yes) {
System.out.println("네 아버지.");
} else {

}
}
}

Main.java


public class Main {
public static void main(String[] args) {
OnesParents onesParents = new Father();
new SeungJae(onesParents);
new SeungHyun(onesParents);

onesParents.notifyParentsObserver("응가하고 손 닦으렴 ^^");
onesParents.notifyParentsObserver("자고 일어나면 귀저기 갈아 입으렴 ^^");
}
}


결과



결론

1. 옵저버 패턴의 포인트는 주체 클래스와 옵저버 클래스간에 추상적인 결합만 존재 합니다. 이로 인하여 주체 클래스는 옵저버 구현 클래스를 몰라도 변화에 대해서 대응이 가능합니다. 즉 아버지는 직접적으로 아이들에게 목아프게 시키지 않고 옵저버를 통해서 시키면 됩니다. 


2. 옵저버 패턴의 두 번째 포인트는 주체가 보내는 통보를 구체적인 수신자를 지정할 필요 없이 통보가 가능합니다. 옵저버에게만 알려주면 옵저버가 통보를 처리해 줍니다. 




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

전략 패턴  (0) 2019.03.08