디자인 모델 의 내용 관찰자 모델
대상 간 의 다 중 의존 을 정의 합 니 다. 그러면 대상 이 상 태 를 바 꿀 때 모든 의존 자 는 알림 을 받 고 자동 으로 업 데 이 트 됩 니 다.
2. 관찰자 모드 도표:
3. 관찰자 모델 의 자기 이해:
(1) < 인터페이스 > > Observer: 관찰자 가 업데이트 한 조작 인 터 페 이 스 를 정의 합 니 다.
(2) < interface > > Subject: 대상 의 등록, 로그아웃, 알림 데이터 업 데 이 트 를 정의 하 는 세 개의 인터페이스
(3) ConcreteObserver 클래스 는 주로 < < interface > > Observer 의 업데이트 작업 을 실 현 했 습 니 다.
(4) Concrete Subject 류, 우 리 는 관리 류 라 고도 할 수 있 습 니 다. 주로 < 인터페이스 > Subject 가 정의 한 등록, 로그아웃 과 데이터 업 데 이 트 를 알 리 는 세 개의 인 터 페 이 스 를 실 현 했 습 니 다. 그 중의 관건 적 인 변수 - list < Concrete Observer > concrete Observer 입 니 다. 이 변 수 는 주로 모든 관찰자 에 게 관 리 를 하고 데이터 가 바 뀌 었 을 때 모든 관찰 자 를 옮 겨 다 니 는 것 입 니 다.상응하는 조작 을 하 다.
4. 나의 작은 예:
이 예 는 Head First 디자인 모델 (중국어 버 전) 이라는 책의 마지막 애플 릿 입 니 다. 저 는 안 드 로 이 드 에서 이 루어 졌 습 니 다.이 예 는 내 가 버튼 을 클릭 할 때 두 명의 관찰자 가 있다 는 것 이다. 한 관찰자 (천사) 는 '친, 나 는 천사 다. 나 는 당신 의 클릭 에 대해 나의 대답 은: 사랑 해!!' 라 고 말 할 것 이다.또 다른 관찰자 (악마) 는 친, 나 는 악마 입 니 다. 나 는 당신 의 클릭 에 대해 나의 대답 은: 나 는 당신 을 미워 합 니 다!!
이 예 에서 나 는 단일 모델, 관찰자 모델 을 응용 했다.
(1)<
public interface IClickListernObserver {
public void onClickToUpdate();
}
(2) ConcreteObserver 클래스 --- AngelObserver:
public class AngelObserver implements IClickListernObserver {
private static AngelObserver instance;
private IAngelClickLister myIAngelClickLister;
public AngelObserver(){
ClickListerManager.getInstance().registerObserver(this);
}
public static AngelObserver getInstance(){
if(instance == null)
instance = new AngelObserver();
return instance;
}
public void setMyIAngelClickLister(IAngelClickLister myIAngelClickLister){
this.myIAngelClickLister = myIAngelClickLister;
}
@Override
public void onClickToUpdate() {
// TODO Auto-generated method stub
myIAngelClickLister.onClickAngelDo();
}
public interface IAngelClickLister{
public void onClickAngelDo();
}
}
(3) ConcreteObserver 클래스 --- DevilObserver:
public class DevilObserver implements IClickListernObserver {
private static DevilObserver instance;
private IDevilClickLister myIDevilClickLister;
public DevilObserver(){
ClickListerManager.getInstance().registerObserver(this);
}
public static DevilObserver getInstance(){
if(instance == null)
instance = new DevilObserver();
return instance;
}
public void setMyIDevilClickLister(IDevilClickLister myIDevilClickLister){
this.myIDevilClickLister = myIDevilClickLister;
}
@Override
public void onClickToUpdate() {
// TODO Auto-generated method stub
myIDevilClickLister.onClickDevilDo();
}
public interface IDevilClickLister{
public void onClickDevilDo();
}
}
(4)<
public interface Subject {
public void registerObserver(IClickListernObserver o);
public void unRegisterObserver(IClickListernObserver o);
public void notifyObservers();
}
(5) Concrete Subject 클래스:
import java.util.ArrayList;
import java.util.List;
public class ClickListerManager implements Subject {
private static ClickListerManager instance;
private List<IClickListernObserver> observers;
public ClickListerManager(){
observers = new ArrayList<IClickListernObserver>();
}
public static ClickListerManager getInstance(){
if(instance == null)
instance = new ClickListerManager();
return instance;
}
public void notifyAllItem(){
notifyObservers();
}
@Override
public void registerObserver(IClickListernObserver object) {
// TODO Auto-generated method stub
if(!observers.contains(object)){
observers.add(object);
}
}
@Override
public void unRegisterObserver(IClickListernObserver object) {
// TODO Auto-generated method stub
if(observers.contains(object)){
observers.remove(object);
}
}
@Override
public void notifyObservers() {
// TODO Auto-generated method stub
for(int i = 0;i < observers.size();i++){
observers.get(i).onClickToUpdate();
}
}
}
(6) ContentObserver Activity 클래스:
import com.example.testcontentobserver01.AngelObserver.IAngelClickLister;
import com.example.testcontentobserver01.DevilObserver.IDevilClickLister;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class ContentObserverActivity extends Activity implements OnClickListener,
IAngelClickLister, IDevilClickLister{
private Button myButton;
private TextView myTextViewAngel;
private TextView myTextViewDevil;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content_observer);
init();
myButton = (Button) findViewById(R.id.myButton);
myButton.setOnClickListener(this);
myTextViewAngel = (TextView) findViewById(R.id.myTextViewAngel);
myTextViewDevil = (TextView) findViewById(R.id.myTextViewDevil);
}
private void init() {
// TODO Auto-generated method stub
AngelObserver.getInstance();
AngelObserver.getInstance().setMyIAngelClickLister(this);
DevilObserver.getInstance();
DevilObserver.getInstance().setMyIDevilClickLister(this);
}
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
int id = view.getId();
switch(id){
case R.id.myButton:
ClickListerManager.getInstance().notifyAllItem();
}
}
@Override
public void onClickAngelDo() {
// TODO Auto-generated method stub
myTextViewAngel.setText(" , , , : !!");
}
@Override
public void onClickDevilDo() {
// TODO Auto-generated method stub
myTextViewDevil.setText(" , , , : !!");
}
}
5. 기상 감 측 응용
이 예 는 Head First 디자인 모델 (중국어 판) 이라는 책의 설명 사례 이기 도 하 다. 이 예 는 현재 세 개의 디 스 플레이 장치 가 있 는데 하 나 는 기상 관측소 의 온 도 를 표시 하고 하 나 는 습 도 를 표시 하 며 하 나 는 기압 을 표시 하 며 이 세 개의 데이터 가 바 뀌 었 을 때 세 개의 디 스 플레이 장 치 를 실시 간 으로 업데이트 하고 나중에 디 스 플레이 장 치 를 추가 하 는 데 편리 해 야 한다.
해결 방안 은 관찰자 모드 입 니 다.
(1) 도표:
(2)interface Subject:
public interface Subject{
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
(3)interface Observer:
public interface Observer{
public void update(float temp,float humidity,float pressure);
}
(4)interface DisplayElement:
public interface DisplayElement{
public void display();
}
(5) WeatherData 클래스:
public class WeatherData implements Subject{
private ArrayList observers;
private float temperature;
private float humidity;
private float pressure;
public void registerObserver(Observer o){
observers.add(o);
}
public void removeObserver (Observer o){
int i = observers.indexOf(o);
if(i >= 0){
observers.remove(i);
}
}
public void notifyObservers (){
for(int i = 0; i < observers.size(); i++ ){
Observer observers = (Observer)observers.get(i);
observers.update(temperature, humidity, pressure);
}
}
public void measurementsChanged(){
notifyObservers();
}
public void setMeasurements(float temperature, float humidity, float pressure){
this. temperature = temperature;
this. humidity = humidity;
this. pressure = pressure;
measurementsChanged();
}
………………….
}
(6) 클래스 전류 조건 표시:
public class CurrentConditionsDisplay implements Observer, DisplayElement{
private float temperature;
private float humidity;
private Subject weatherData;
public CurrentConditionsDisplay(Subject weatherData){
this. weatherData = weatherData;
weatherData. registerObserver(this);
}
public void update(float temperature, float humidity, float pressure){
this. temperature = temperature;
this. humidity = humidity;
display();
}
public void display(){
System.out.println(“Current conditions:” + temperature + “F degrees and ” + humidity + “% humidity”);
}
}
(7) 이와 유사 한 것 은 Statistics Display, ForecastDisplay 두 가지 생략 을 실현 할 수 있 습 니 다.
(8) 테스트 클래스:
public class WeatherStation{
public static void main(String[] args){
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);
StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);
ForecastDisplay forecastDisplay = new ForecastDisplay (weatherData);
weatherData. setMeasurements(80,65,30.4f);
weatherData. setMeasurements(70,75,31.4f);
weatherData. setMeasurements(90,55,32.4f);
}
}
참고 자료: 1.http://blog.csdn.net/hfreeman2011/article/details/8308873
2. Head First 디자인 모델 (중국어 판), 중국 전력 출판사 출판, O 'REILLY 회사 번역 - (39 - 78 쪽) 관찰자 모델
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.