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()
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
perl의 코드가 된 gif 파일작년에 을 썼기 때문에 감사합니다. 환경 This is perl 5, version 24, subversion 0 (v5.24.0) built for x86_64-linux-thread-multi Version: I...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.