옵저버 패턴은 알림 기능에 사용됩니다. 실제 구현에서는 알림 기능에서 차단 된 클래스가 거의 없을 수 있습니다. 기본적으로 내 질문은 차단하는 기능을 알리는 피하는 방법입니다. 왜냐하면 하나의 클래스로 인해 차단되면 다른 모든 호출을 차단하기 때문입니다. 아래의 update() 함수 예제에서와 같이 DivObserver 클래스에서 블로킹을합니다.
클래스 중 하나의 차단 문을 보여 원본과 클래스 아래에 수정 된 항목 :옵저버 디자인 패턴 클래스 문제
class DivObserver: public Observer {
public:
DivObserver(Subject *mod, int div): Observer(mod, div){}
void update()
{
pthread_mutex_lock();
/*blocking statement call*/
pthread_mutex_unlock();
}
};
-----------------------------------text book example--------------------- ---------------
#include <iostream>
#include <vector>
using namespace std;
class Subject {
// 1. "independent" functionality
vector < class Observer * > views; // 3. Coupled only to "interface"
int value;
public:
void attach(Observer *obs)
{
views.push_back(obs);
}
void setVal(int val)
{
value = val;
notify();
}
int getVal() {
return value;
}
void notify();
};
class Observer {
// 2. "dependent" functionality
Subject *model;
int denom;
public:
Observer(Subject *mod, int div) {
model = mod;
denom = div;
// 4. Observers register themselves with the Subject
model->attach(this);
}
virtual void update() = 0;
protected:
Subject *getSubject() {
return model;
}
int getDivisor() {
return denom;
}
};
void Subject::notify() {
// 5. Publisher broadcasts
for (int i = 0; i < views.size(); i++)
views[i]->update();
}
class DivObserver: public Observer {
public:
DivObserver(Subject *mod, int div): Observer(mod, div){}
void update() {
// 6. "Pull" information of interest
int v = getSubject()->getVal(), d = getDivisor();
cout << v << " div " << d << " is " << v/d << '\n';
}
};
class ModObserver: public Observer {
public:
ModObserver(Subject *mod, int div): Observer(mod, div){}
void update() {
int v = getSubject()->getVal(), d = getDivisor();
cout << v << " mod " << d << " is " << v % d << '\n';
}
};
int main() {
Subject subj;
DivObserver divObs1(&subj, 4); // 7. Client configures the number and
DivObserver divObs2(&subj, 3); // type of Observers
ModObserver modObs3(&subj, 3);
subj.setVal(14);
}
가장 확실한 해결책은 "관찰자가 차단하면 안된다. 관측자가 차단하면 너무 나쁘다"는 관찰 가능한 것을 문서화하는 것입니다. –
나는 그것을 0으로 되돌릴 것이다 :) –