D 언어 디자인 모드 Observer

더 읽 기
Observer 디자인 모드
유형: 행동 형
의미: 대상 간 의 다 중 의존 관 계 를 정의 합 니 다. 대상 의 상태 가 바 뀌 면 모든 의존 대상 이 알림 을 받 고 자동 으로 업 데 이 트 됩 니 다.
적용: 추상 적 인 모델 이 두 가지 측면 이 있 을 때 그 중 하 나 는 다른 한편 에 의존한다.이 두 가 지 를 독립 된 대상 에 봉 하여 각자 독립 적 으로 바 꾸 고 재 활용 할 수 있 도록 하 다.
한 대상 의 변화 에 대해 다른 대상 을 동시에 바 꿔 야 할 때 구체 적 으로 얼마나 많은 대상 이 바 뀌 어야 할 지 모른다.
대상 이 다른 대상 에 게 알려 야 하 는데, 다른 대상 이 누구 인지 가정 할 수도 없다.다시 말 하면, 너 는 이 대상 들 이 긴밀 하 게 결합 되 기 를 바라 지 않 는 다.
D 의 Phobos 라 이브 러 리 std. signals 가 이 모드 를 실 현 했 습 니 다.
의뢰 를 이용 해 쉽게 이 룰 수 있 습 니 다.
DFL 의 이벤트 위탁 할당 체 제 는 Observer 모드 로 이 루어 집 니 다.
import std.signals;
import std.stdio;

class Observer
{   // our slot
    void watch(char[] msg, int i)
    {
			writefln("Observed msg '%s' and value %s", msg, i);
    }
    
    void exc(char[] msg, int i)
    {
			writefln("EXEC OBJECT '%s' and value %s", msg, i);
    }
}


class Observera
{   // our slot
    void watch(char[] msg, int i)
    {
				writefln("LLPF msg '%s' and value %s", msg, i);
    }
}

class Foo
{
    int value() { return _value; }

    int value(int v)
    {
			if (v != _value)
			{   _value = v;
			    // call all the connected slots with the two parameters
			    emit("set Value to:", v);
			}
			return v;
    }

    // Mix in all the code we need to make Foo into a signal
    mixin Signal!(char[], int);

  private :
    int _value;
}

void main()
{
    Foo a = new Foo;
    Observer o = new Observer;
    Observera b = new Observera;

    a.value = 3;		// should not call o.watch()
    a.connect(&o.watch);	// o.watch is the slot
    a.connect(&o.exc);
    a.connect(&b.watch);	// o.watch is the slot
    
    a.value = 4;		// should call o.watch()
    a.disconnect(&o.watch);	// o.watch is no longer a slot
    a.value = 5;		// so should not call o.watch()
    a.connect(&o.watch);	// connect again
    a.value = 6;		// should call o.watch()
    delete o;			// destroying o should automatically disconnect it
    a.value = 7;		// should not call o.watch()
}

좋은 웹페이지 즐겨찾기