현대 C 언어의 프록시 디자인 모드++
17559 단어 designcodenewbietutorialcpp
/!\: This article has been originally published on my blog. If you are interested in receiving my latest articles, please sign up to my newsletter.
다른 구조 설계 모드를 아직 보지 않은 경우 목록은 다음과 같습니다.
override
, final
, public
, (while inheritation) 같은 키워드를 사용하지 않는 것을 자주 본다. 단지 하나의 표준 화면 크기에서 코드를 촘촘하고 사용하기 쉽기 위해서이다(대다수 경우).나도 struct
를 더 좋아한다. class
는 때때로 "public:
"를 쓰지 않고 줄을 저장하고 일부러 놓친다virtual destructor, 구조 함수copy constructor, 접두사std::
, 동적 메모리를 삭제한다.나는 또한 내가 실용적인 사람이라고 생각하고 가능한 한 간단한 방식으로 생각을 표현하고 표준적인 방식이나 행화가 아니라 희망한다.참고:
의 의도
An interface for accessing a particular resource.
C 언어의 프록시 디자인 모드 예시++
// Ways to access object through pointer
ptr->print();
*ptr = 5;
재산 대리
Property
클래스를 다음과 같이 작성할 것이다.template<typename T>
struct Property {
T m_value;
Property(const T initialValue) { * this = initialValue; }
operator T() { return m_value; }
T operator = (T newValue) { return m_value = newValue; }
};
struct Creature {
Property<int32_t> m_strength{10};
Property<int32_t> m_agility{5};
};
int main() {
Creature creature;
creature.m_agility = 20;
cout << creature.m_agility << endl;
return EXIT_SUCCESS;
}
strength
와 agility
를 int32_t
로 성명하지 않았는지 생각할 수 있습니다.어떤 이유로 이 필드에 대한 접근을 차단하거나 기록해야 한다고 가정해 봅시다.따라서 모든 속성을 위한 Getter &setter 방법이 아니라 Property
로 효과적인 방법이 필요합니다.가상 에이전트
struct Image {
virtual void draw() = 0;
};
struct Bitmap : Image {
Bitmap(const string &filename) : m_filename(filename) {
cout << "Loading image from " << m_filename << endl;
// Steps to load the image
}
void draw() { cout << "Drawing image " << m_filename << endl; }
string m_filename;
};
int main() {
Bitmap img_1{"image_1.png"};
Bitmap img_2{"image_2.png"};
(rand() % 2) ? img_1.draw() : img_2.draw();
return EXIT_SUCCESS;
}
Bitmap
이미지는 Image
인터페이스에서 파생된 것으로 이 인터페이스는 다태적 행위를 가진다draw()
.Bitmap
그림을 구조 함수에 급히 불러옵니다.Bitmap
의 문제는 그림 코드가 시작되기 전에 그림을 불러올 필요가 없다는 것이다.따라서 구축할 때 두 개의 이미지를 메모리에 불러오는 것은 무의미하다.struct LazyBitmap : Image {
LazyBitmap(const string &filename) : m_filename(filename) {}
void draw() {
if (!m_bmp) m_bmp = make_unique<Bitmap>(m_filename);
m_bmp->draw();
}
unique_ptr<Bitmap> m_bmp{nullptr};
string m_filename;
};
LazyBitmap img_1{"image_1.png"};
LazyBitmap img_2{"image_2.png"};
Bitmap
가 필요하기 전에 그것을 사용하지 않습니다.반대로 그림을 그리려는 사람이 만들 수 있도록 파일 이름만 캐시합니다. Bitmap
따라서 그림을 그리려는 사람이 없다면 파일에서 그림을 불러오는 것은 무의미하다.통신 에이전트 (C++의 직관 에이전트 디자인 모드)
Bitmap
를 고려하면 기본 유형의 2D 배열과 동일한 방식으로 작동합니다.template <typename T>
struct arr2D {
struct proxy {
proxy(T *arr) : m_arr_1D(arr) {}
T &operator[](int32_t idx) {
return m_arr_1D[idx];
}
T *m_arr_1D;
};
arr2D::proxy operator[](int32_t idx) {
return arr2D::proxy(m_arr_2D[idx]);
}
T m_arr_2D[10][10];
};
int main() {
arr2D<int32_t> arr;
arr[0][0] = 1; // Uses the proxy object
return EXIT_SUCCESS;
}
대리 디자인 모델의 장점
FAQ 요약
Decorator와 Proxy 디자인 모델이 같습니까?
그것들은 약간 비슷하지만 용도가 다르다.예를 들어 위의 예를 고려하면 에이전트는 보통 생명주기 & 대상에 대한 접근을 관리하고 장식기는 원시 대상의 포장으로 더 많은 기능을 가진다.
어댑터, 장식기와 프록시 디자인 모델 사이의 차이는?
- 어댑터는 포장된 객체에 대해 서로 다른/호환 가능한 인터페이스를 제공합니다.
-- Proxy는 대개 동일하거나 간단한 인터페이스를 제공합니다.
-- Decorator는 향상된 인터페이스를 제공합니다.
대리 디자인 모델의 용례는 무엇입니까?
- 객체가 자원을 소비하고 대부분의 시간을 디스크에 저장하는 경우 위의 불활성 이미지 로드에서 수행한 것처럼 프록시를 자리 표시자로 사용할 수 있습니다.
- 객체에 대한 읽기 전용 액세스나 사용자 기반 액세스 제어 등의 액세스 제한을 실제 작업을 수행하기 전에 추가하려는 경우(예: 사용자가 승인을 받은 경우 해당 작업을 수행하고 승인이 없는 경우 액세스 제어 예외가 발생)
Reference
이 문제에 관하여(현대 C 언어의 프록시 디자인 모드++), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/visheshpatel/proxy-design-pattern-in-modern-c-aj9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)