Java 디자인 모드【1】--관찰자
1. 개념
객체 간에 일대다 관계가 있는 경우 관찰자 모드(Observer Pattern)를 사용합니다.예를 들어, 대상이 수정되면 의존 대상을 자동으로 알린다.관찰자 모델은 행위형 모델에 속한다.
2. 소개
서유기에서 오공은 보살에게 붉은 아이를 굴복시켜 달라고 부탁했다. 보살은 바닥에 물을 뿌려 한 늙은 거북이를 불러왔다. 이 거북이가 바로 관찰자이다. 그는 보살이 물을 뿌리는 동작을 관찰했다.
2.1. 장단점
2.1.1. 장점
2.1.2. 결점
3. 장면 사용:
하나의 추상 모델은 두 가지 측면이 있는데, 그 중 하나는 다른 측면에 의존한다.이러한 부분을 독립된 대상에 봉하여 각각 독립적으로 바꾸고 복용할 수 있도록 하다.한 대상의 변화는 다른 한 개 이상의 대상도 바뀌게 할 것이다. 구체적으로 얼마나 많은 대상이 바뀔지 모르면 대상 간의 결합도를 낮출 수 있다.한 대상은 다른 대상에게 통지해야 하며, 이 대상들이 누구인지 모른다.시스템에서 트리거 체인을 만들어야 합니다. A 대상의 행위는 B 대상에게 영향을 주고 B 대상의 행위는 C 대상에게 영향을 줍니다. 관찰자 모드를 사용하여 체인식 트리거 메커니즘을 만들 수 있습니다.
주의 사항
4. 실현
관찰자 모드에는 세 가지 유형의 Subject, Observer 및 Client가 사용됩니다.Subject 객체에는 관찰자를 클라이언트 객체로 결합하고 클라이언트 객체에서 관찰자를 결합해제하는 방법이 있습니다.Subject 클래스, Observer 추상 클래스를 만들고 추상 클래스 Observer의 실체 클래스를 확장했습니다.
4.1. 관찰자
4.1.1. 이음매
package xyz.wongs.shumer.design.observer;
public interface Observer {
void see(BaseSubject abstractSubject);
}
4.1.2. 관찰자 동작
package xyz.wongs.shumer.design.observer;
public class ObserverImpl implements Observer {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public void see(BaseSubject baseSubject) {
msg = ((Subject)baseSubject).getMsg();
}
}
4.2. 메시지
4.2.1. 추상류
package xyz.wongs.shumer.design.observer;
import java.util.ArrayList;
import java.util.List;
public abstract class BaseSubject {
private List list = new ArrayList();
public void addObserver(Observer observer){
list.add(observer);
}
public void removeObserver(Observer observer){
list.remove(observer);
}
public void notifyObserver(){
for(Observer observer:list){
observer.see(this);
}
}
}
4.2.2. 주제 구현
package xyz.wongs.shumer.design.observer;
public class Subject extends BaseSubject {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg){
this.msg=msg;
this.notifyObserver();
}
}
4.3. 테스트 클래스
package xyz.wongs.shumer;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import xyz.wongs.shumer.design.observer.ObserverImpl;
import xyz.wongs.shumer.design.observer.Subject;
public class AppTest {
@Test
public void testObserver() {
Subject targetSubject = new Subject();
ObserverImpl observerDesign1 = new ObserverImpl();
ObserverImpl observerDesign2 = new ObserverImpl();
ObserverImpl observerDesign3 = new ObserverImpl();
ObserverImpl observerDesign4 = new ObserverImpl();
targetSubject.addObserver(observerDesign1);
targetSubject.addObserver(observerDesign2);
targetSubject.addObserver(observerDesign3);
targetSubject.addObserver(observerDesign4);
targetSubject.setMsg(Thread.currentThread().getName());
System.out.println(observerDesign1.getMsg());
System.out.println(observerDesign2.getMsg());
System.out.println(observerDesign3.getMsg());
System.out.println(observerDesign4.getMsg());
}
}
2019-08-29_211956.png
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
package xyz.wongs.shumer.design.observer;
public interface Observer {
void see(BaseSubject abstractSubject);
}
package xyz.wongs.shumer.design.observer;
public class ObserverImpl implements Observer {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public void see(BaseSubject baseSubject) {
msg = ((Subject)baseSubject).getMsg();
}
}
package xyz.wongs.shumer.design.observer;
import java.util.ArrayList;
import java.util.List;
public abstract class BaseSubject {
private List list = new ArrayList();
public void addObserver(Observer observer){
list.add(observer);
}
public void removeObserver(Observer observer){
list.remove(observer);
}
public void notifyObserver(){
for(Observer observer:list){
observer.see(this);
}
}
}
package xyz.wongs.shumer.design.observer;
public class Subject extends BaseSubject {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg){
this.msg=msg;
this.notifyObserver();
}
}
package xyz.wongs.shumer;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import xyz.wongs.shumer.design.observer.ObserverImpl;
import xyz.wongs.shumer.design.observer.Subject;
public class AppTest {
@Test
public void testObserver() {
Subject targetSubject = new Subject();
ObserverImpl observerDesign1 = new ObserverImpl();
ObserverImpl observerDesign2 = new ObserverImpl();
ObserverImpl observerDesign3 = new ObserverImpl();
ObserverImpl observerDesign4 = new ObserverImpl();
targetSubject.addObserver(observerDesign1);
targetSubject.addObserver(observerDesign2);
targetSubject.addObserver(observerDesign3);
targetSubject.addObserver(observerDesign4);
targetSubject.setMsg(Thread.currentThread().getName());
System.out.println(observerDesign1.getMsg());
System.out.println(observerDesign2.getMsg());
System.out.println(observerDesign3.getMsg());
System.out.println(observerDesign4.getMsg());
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.