현대 C 언어에서의 교량 설계 모델++
"All problems in computer science can be solved by another level of indirection." -- David Wheeler
참고로 구조 설계 모델에 대한 나의 다른 글을 읽지 않았다면 다음은 목록입니다.
override
, final
, public
같은 키워드를 사용하지 않는 것을 자주 본다. 단지 하나의 표준 화면 크기에서 코드를 치밀하고 소비할 수 있도록 하기 위해서이다.나도 struct
가 아니라 class
을 더 좋아한다. 다만 때때로 "public:
"를 쓰지 않고 줄을 저장하고, 일부러 virtual destructor, 구조 함수, copy constructor, 접두사std::
를 놓치고, 동적 메모리를 삭제한다.나는 또 내가 실용적인 사람이라고 생각하며, 가능한 한 간단한 방식으로 하나의 생각을 표현하기를 바란다. 표준적인 방식이나 행어가 아니라.주:
/!\: This article has been originally published on my blog. If you are interested in receiving my latest articles, please sign up to my newsletter.
의도
To separate the interface from its implementation.
교량 설계 모델의 동기
Shape
라는 기본 클래스가 있다고 가정하면 Shape
또는 Circle
또는 API 1 또는 API 2로 그릴 수 있습니다.struct DrawingAPI_1 { };
struct DrawingAPI_2 { };
struct Shape { virtual void draw() = 0; };
/* 2 x 2 scenario */
struct Circle : Shape, DrawingAPI_1 { };
struct Circle : Shape, DrawingAPI_2 { };
struct Square : Shape, DrawingAPI_1 { };
struct Square : Shape, DrawingAPI_2 { };
Square
과Circle
,API_1
과Circle
등등.API_2
및 Circle
에 집합할 필요가 없습니다.교량 설계 모드 C++ 예
struct DrawingAPI {
virtual void drawCircle() = 0;
};
struct DrawingAPI_1 : DrawingAPI {
void drawCircle() { cout << "Drawn by API 1"<< endl; }
};
struct DrawingAPI_2 : DrawingAPI {
void drawCircle() { cout << "Drawn by API 2"<< endl; }
};
struct Shape {
Shape(DrawingAPI &drawingAPI) : m_drawingAPI{drawingAPI} {}
virtual void draw() = 0;
protected:
DrawingAPI &m_drawingAPI; // Now Shapes does not need to worry about drawing APIs
};
struct Circle : Shape {
Circle(DrawingAPI &drawingAPI) : Shape{drawingAPI} {}
void draw() { m_drawingAPI.drawCircle(); }
};
int main() {
DrawingAPI_1 API_1;
DrawingAPI_2 API_2;
Circle(API_1).draw();
Circle(API_2).draw();
return EXIT_SUCCESS;
}
C++ 관용법을 사용하는 브리지 설계 모드: PIMPL
#pragma once
#include <string>
#include <memory>
struct Person {
/* PIMPL ------------------------------------ */
class PersonImpl;
unique_ptr<PersonImpl> m_impl; // bridge - not necessarily inner class, can vary
/* ------------------------------------------ */
string m_name;
Person();
~Person();
void greet();
private:
// secret data members or methods are in `PersonImpl` not here
// as we are going to expose this class to client
};
사람cpp<-- 비즈니스 논리를 숨기기 위해 공유 라이브러리(.so/.dll)로 변환#include "Person.h"
/* PIMPL Implementation ------------------------------------ */
struct Person::PersonImpl {
void greet(Person *p) {
cout << "hello "<< p->name.c_str() << endl;
}
};
/* --------------------------------------------------------- */
Person::Person() : m_impl(new PersonImpl) { }
Person::~Person() { delete m_impl; }
void Person::greet() { m_impl->greet(this); }
안전하고 빠른 PIMPL
Square
중Person
의 데이터 구성원, 예를 들어 전달PersonImpl
지침 등을 방문하고 싶다면 우리는 반드시 간접적인 조작을 해야 한다.#pragma once
#include <string>
#include <cstddef>
#include <type_traits>
struct Person {
Person();
~Person();
void greet();
private:
static constexpr size_t m_size = 1024;
using pimpl_storage_t = aligned_storage<m_size, alignment_of_v<max_align_t>>::type;
string m_name;
pimpl_storage_t m_impl;
};
사람cpp<-- 비즈니스 논리를 숨기기 위해 공유 라이브러리(.so/.dll)로 변환#include "Person.h"
#include <iostream>
struct PersonImpl {
void greet(string &name) {
cout << "hello "<< name << endl;
}
};
Person::Person() {
static_assert(sizeof(impl) >= sizeof(PersonImpl)); // Compile time safety
new(&impl) PersonImpl;
}
Person::~Person() { reinterpret_cast<PersonImpl*>(&impl)->~PersonImpl(); }
void Person::greet() { reinterpret_cast<PersonImpl*>(&impl)->greet(name); }
캐스트 재해석 교량 설계 모델의 장점
PIMPL 회사 FAQ 요약
교량 설계 모델의 실제 용례는 무엇입니까?
모든 인터넷 브라우저의 플러그인은 이런 모델을 직접 이용하는데 그 중에서 브라우저는 추상적인 것만 지정하고 서로 다른 유형의 플러그인에 따라 다르게 실현한다.
교량 설계 모델은 언제 사용합니까?
- 구현 또는 변형이 확실하지 않을 때 계속 개발하기를 원합니다.
- 행동 교환 문제, 즉 피리칼 곱셈 복잡성 폭발.
어댑터와 브리지 디자인 모델 사이에는 어떤 차이가 있습니까?
--Adapter는 일반적으로 기존 응용 프로그램과 함께 사용되어 다른 방면에서 호환되지 않는 클래스들이 협동하여 작업할 수 있도록 한다.
--Bridge는 일반적으로 미리 설계되어 응용 프로그램의 각 부분을 독립적으로 개발할 수 있습니다.
전략과 교량 설계 모델 사이에는 어떤 차이가 있습니까?
- 다중 드라이버와 유사한 1차원 문제입니다.
- 브리지는 통신 유형과 장치와 유사한 다차원 문제입니다.Strategy
Reference
이 문제에 관하여(현대 C 언어에서의 교량 설계 모델++), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/visheshpatel/bridge-design-pattern-in-modern-c-57m4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)