Загварын загвар: Адаптер. Бүтцийн загварууд: адаптер Java хэл дээрх адаптеруудад зориулсан бэлэн код

    Адаптер (дизайн загвар)/кодын жишээ- Үндсэн өгүүлэл: Адаптер (дизайн загвар) Системийг ашиглан C# хэл дээр хэв маягийн хэрэгжилтийн жишээ; namespace адаптер ( анги MainApp ( статик хүчингүй Main() ( ... Википедиа

    Прокси загвар (дизайн загвар)

    Дизайн загвар- Энэ нэр томъёо нь өөр утгатай, Загварыг үзнэ үү. Програм хангамж боловсруулахад дизайны загвар нь асуудлыг шийдэх шийдлийг илэрхийлдэг давтагдах архитектурын загвар юм... ... Википедиа

    Интерфейс (дизайн загвар)- Загварын загвар ИнтерфэйсДизайн загварт тайлбарласан Үгүй Компьютерийн шинжлэх ухаанд интерфейсийн загвар нь дизайны загваруудын дунд онцгой загвар биш юм. Энэ нь бүтцийн ерөнхий арга юм компьютерийн програмуудүүний төлөө... Википедиа

    Орлогч (дизайн загвар)- Прокси загвар (орлогч) дизайны загвар. Энэ нь хандалтыг хянах объектоор хангадаг бөгөөд түүн рүү ирсэн бүх дуудлагыг тасалдаг. Агуулга 1 Зорилго 1.1 Асуудал 1.2 Шийдэл 2 Давуу тал 3 ... Википедиа

    Хамгаалагч (дизайн загвар)- Design Pattern Guardian Memento төрөл: Зан төлөвийг Загварын загварт дүрсэлсэн Тийм Guardian (мөн Memento, Token, Token гэж нэрлэдэг) нь зан үйлийн загварын загвар юм. Капсулыг эвдэхгүйгээр засах боломжийг танд олгоно... Википедиа

    Давталт (дизайн загвар)- Загварын хэв маяг Давтагч давталтын төрөл: зан төлөвт Загварын загварт тайлбарласан Тийм Давтагч загвар (мөн курсор гэж нэрлэдэг) Зан төлөвийн хэв маягийг илэрхийлдэг дизайны загвар. Энэ нь ... Википедиа авах боломжийг олгодог объект юм

    Орчуулагч (дизайн загвар)- Загварын загвар Орчуулагч Төрөл: зан үйл Зорилго: Байнга тохиолддог, өөрчлөгддөг асуудлыг шийддэг Загварын загваруудад тайлбарласан Тийм Орчуулагчийн загвар (Англи ... Wikipedia

    Холбогч (дизайн загвар)- Загварын загвар Нийлмэл төрөл: бүтцийн Дизайн загварт тодорхойлогдсон Тиймээ Нийлмэл загвар нь дизайны загвар бөгөөд бүтцийн хэв маягийг илэрхийлдэг, объектыг нэгтгэдэг ... Wikipedia

    Төлөв (дизайн загвар)- Төлөв дизайны загвар Төрөл: зан төлөв Загварын загварт дүрсэлсэн Тийм төлөв нь дизайны загвар юм. Энэ нь програмыг гүйцэтгэх явцад объект ... Википедиа тохиолдолд хэрэглэгддэг

    Үндсэн өгүүлэл: Адаптер (дизайн загвар) Системийг ашиглан C# хэл дээрх загварыг хэрэгжүүлэх жишээ; namespace адаптер ( анги MainApp ( статик хүчингүй Main() ( ... Википедиа

    Энэ нэр томъёо нь өөр утгатай, Загварыг үзнэ үү. Програм хангамж боловсруулахад дизайны загвар нь асуудлыг шийдэх шийдлийг илэрхийлдэг давтагдах архитектурын загвар юм... ... Википедиа

    Интерфейсийн дизайны загвар интерфэйс Дизайн загварт дүрслэгдсэн Үгүй Компьютерийн шинжлэх ухаанд интерфейсийн загвар нь дизайны загваруудын дунд онцгой загвар биш юм. Энэ нь... Википедиа

    Прокси загвар дизайны загвар. Энэ нь хандалтыг хянах объектоор хангадаг бөгөөд түүн рүү ирсэн бүх дуудлагыг тасалдаг. Агуулга 1 Зорилго 1.1 Асуудал 1.2 Шийдэл 2 Давуу тал 3 ... Википедиа

    Загварын хэв маягийн хамгаалагч Memento төрөл: Зан төлөвийг Загварын загварт дүрсэлсэн Тийм Guardian (мөн Memento, Token, Token гэж нэрлэдэг) нь зан үйлийн дизайны загвар юм. Капсулыг эвдэхгүйгээр засах боломжийг танд олгоно... Википедиа

    Загварын загвар Давтагч давталтын төрөл: Загварын загварт дүрсэлсэн зан төлөв Тийм Давтагч загвар (мөн курсор гэж нэрлэдэг) Зан төлөвийн хэв маягийг илэрхийлдэг дизайны загвар. Энэ нь ... Википедиа авах боломжийг олгодог объект юм

    Загварын загвар Орчуулагч Төрөл: зан үйл Зорилго: байнга тохиолддог, өөрчлөгддөг асуудлыг шийддэг Загварын загваруудад тайлбарласан Тийм Орчуулагчийн загвар (Англи ... Wikipedia

    Загварын загвар Нийлмэл төрөл: бүтцийн Дизайн загварт тодорхойлогдсон Тиймээ Нийлмэл загвар нь дизайны загвар бөгөөд бүтцийн хэв маягийг илэрхийлдэг, объектыг нэгтгэдэг ... Wikipedia

    Загварын загвар төлөв Төрөл: зан төлөв Загварын загварт тайлбарласан Тийм төлөв нь дизайны загвар юм. Энэ нь програмыг гүйцэтгэх явцад объект ... Википедиа тохиолдолд хэрэглэгддэг

Уншихаасаа өмнө дараах конвенц, үзэл баримтлалтай танилцана уу. Энэ нийтлэл нь тодорхой давтамжтайгаар шинэчлэгддэг тул хэрэв та үүнийг өмнө нь уншиж байсан бол өгөгдөл өөрчлөгдөөгүй нь баримт биш юм.

Адаптерангилалд хамаарах бүтцийнхэв маяг. Энэ нь үйлчлүүлэгчийн шаардлагатай нэг интерфейсийг нөгөө рүү хөрвүүлэхэд ашиглагддаг. Адаптер нь давхаргыг хэрэгжүүлэх замаар үл нийцэх интерфейсүүдийн нийцтэй байдлыг баталгаажуулдаг.

Үйл ажиллагааны зарчим

Адаптер нь зорилтот интерфэйсийг нээлттэй хэлбэрээр өвлөн авдаг (үүнийг нэрлэе Зорилтот) болон дасан зохицох хаалттай интерфэйс ( Дасан зохицох). Зорилтот интерфэйсийн аргуудыг хэрэгжүүлэхдээ хүсэлтийг дасан зохицох боломжтой интерфэйс бүхий анги руу шилжүүлдэг (төлөөлөгдсөн).

Жишээ

// Зорилтот интерфейс, үйлчлүүлэгч зөвхөн iTarget интерфэйстэй ажиллах боломжтой ( нийтийн функцийн query(); ) // Дасан зохицох интерфейс. Үйлчлүүлэгч үүнтэй хэрхэн ажиллахаа мэдэхгүй байгаа ч iAdaptee интерфэйсийг үнэхээр хүсч байна ( public function request(); ) // Дасан зохицох боломжтой интерфэйсийн классыг хэрэгжүүлдэг анги Adaptee iAdaptee ( public function request() ( return __CLASS__ . ":: " . __METHOD__; ) ) ангиллын адаптер нь iTarget (хамгаалагдсан $adaptee = null; public function __construct() ( $this -> adaptee = new Adaptee(); ) public function query() ($this -> adaptee -> хүсэлтийг буцаана) хэрэгжүүлдэг. (); ) ) $ Зорилтот = шинэ адаптер(); хэвлэх $Target -> query(); // "Дасан зохицох:: хүсэлт"

Дүгнэлт

Адаптер нь хэд хэдэн интерфэйсийг нэг дор тохируулах боломжтой бөгөөд үүнийг ийм загвар гэж нэрлэдэг объект адаптерЭнэ загварыг ашиглах нь хэд хэдэн тохиолдолд зөвтгөгддөг. Хэрэв та өөр интерфэйстэй одоо байгаа анги ашиглахыг хүсвэл. Хэрэв та дасан зохицох интерфейсийг хэд хэдэн газар ашиглах гэж байгаа бөгөөд үүнийг хаа сайгүй ижил харагдуулах боломж байхгүй бол сольж болох адаптер ашиглах нь зүйтэй болов уу.

Адаптерийн загварын зорилго

Ихэнхдээ шинэ програм хангамжийн төсөлОдоо байгаа кодыг дахин ашиглах боломжгүй. Жишээлбэл, одоо байгаа ангиуд нь хүссэн функцтэй байж болох ч нийцгүй интерфейстэй байж болно. Ийм тохиолдолд та адаптерийн загварыг ашиглах хэрэгтэй.

Адаптерийн загвар нь одоо байгаа ангиудын програм хангамжийн багц бөгөөд тэдгээрийн интерфэйсийг дараа нь ашиглахад тохиромжтой хэлбэр болгон хувиргадаг.

Адаптерийн загварыг хэзээ ашиглах ёстойг энгийн жишээгээр харцгаая. Хүрээлэн буй орчны температурыг тогтоосон хязгаарт автоматаар хадгалах зориулалттай цаг уурын хяналтын системийг боловсруулцгаая. Чухал бүрэлдэхүүн хэсэгИйм систем нь температур мэдрэгч бөгөөд түүний тусламжтайгаар дараагийн шинжилгээнд зориулж орчны температурыг хэмждэг. Энэ мэдрэгчийн хувьд аль хэдийн бэлэн болсон байна програм хангамжтохирох интерфэйстэй анги болох гуравдагч талын хөгжүүлэгчдээс. Гэхдээ мэдрэгчийн заалтыг Фаренгейтийн градусаар авдаг тул та энэ ангийг шууд ашиглах боломжгүй. Температурыг Цельсийн хэмд хувиргадаг адаптер хэрэгтэй.

STL стандарт загварын номын сангийн дараалал, тэргүүлэх_дараалал, стек контейнерууд нь интерфэйсийг хүссэн хэлбэрт тохируулан дараалсан жагсаалт, деке, вектор контейнер дээр үндэслэн хэрэгжүүлдэг. Ийм учраас эдгээр савыг адаптер сав гэж нэрлэдэг.

Адаптерийн загварын тодорхойлолт

Интерфейсийг хүссэн харагдах байдалд тохируулах шаардлагатай ангийг Adaptee гэж нэрлээрэй. Интерфейсээ өөрчлөх асуудлыг шийдэхийн тулд адаптерийн загвар нь дараах ангиллын шатлалыг нэвтрүүлнэ.

  • Зорилтот виртуал суурь анги. Энд зарласан Хэрэглэгчийн интерфэйстохиромжтой төрөл. Зөвхөн энэ интерфейсийг хэрэглэгч ашиглах боломжтой.
  • Зорилтот интерфейсийг хэрэгжүүлдэг адаптерийн үүсмэл анги. Энэ анги нь мөн адаптерийн инстанцын заагч эсвэл лавлагааг агуулна. Adapter загвар нь үйлчлүүлэгчийн дуудлагыг Adaptee руу дамжуулахын тулд энэ заагчийг ашигладаг. Дасан зохицох болон Зорилтот интерфэйсүүд нь хоорондоо нийцэхгүй байдаг тул эдгээр дуудлага нь ихэвчлэн хөрвүүлэх шаардлагатай байдаг.

Адаптерийн загварыг хэрэгжүүлэх

Адаптерийн загварын сонгодог хэрэгжилт

Энд адаптерийн загварын хэрэгжилт байна. Дээрх жишээний хувьд бид уур амьсгалын хяналтын системийн температур мэдрэгчийн уншилтыг Фаренгейтийн хэмээс Цельсийн градус болгон хувиргадаг (энэ мэдрэгчийн кодыг өөрчлөх боломжгүй гэж үздэг).

#оруулна // Аль хэдийн байгаа орчны температур мэдрэгчийн ангийн анги FahrenheitSensor ( public: // Fahrenheit-ийн температурын заалтыг авах float getFahrenheitTemp() ( float t = 32.0; // ... зарим кодыг буцаана t; ) ); анги Мэдрэгч ( нийтийн: виртуал ~Мэдрэхүй() () виртуал хөвөх getTemperature() = 0; ); анги Адаптер: нийтийн мэдрэгч ( нийтийн: Адаптер(FahrenheitSensor* p) : p_fsensor(p) ( ) ~Адаптер() ( p_fsensor устгах; ) float getTemperature() ( буцах (p_fsensor->getFahrenheitTemp()-32.0)*5.0/9.0 ; ) хувийн: FahrenheitSensor* p_fsensor; ); int main() ( Мэдрэгч* p = шинэ адаптер(шинэ FahrenheitSensor); cout<< "Celsius temperature = " << p->getTemperature()<< endl; delete p; return 0; }

Хаалттай удамшлын үндсэн дээр адаптерийн загварыг хэрэгжүүлэх

Уур амьсгалын хяналтын системийн температур мэдрэгчийг илүү нарийвчлалтай уншихын тулд тохируулах функцийг дэмжинэ үү. Энэ функцийг ашиглах шаардлагагүй тул одоо байгаа FahrenheitSensor анги дахь хөгжүүлэгчид харгалзах тохируулах() аргыг хамгаалсан гэж зарласан байж магадгүй юм.

Бидний хөгжүүлж буй систем нь хэмжилтийн тохиргоог дэмжих ёстой. Заагч эсвэл холбоосоор хамгаалагдсан арга руу нэвтрэхийг хориглодог тул адаптерийн хэв маягийн сонгодог хувилбар энд тохирохгүй. Ганц шийдэл бол FahrenheitSensor ангиас өвлөн авах явдал юм. Энэ ангийн интерфэйс нь хэрэглэгчдэд нэвтрэх боломжгүй хэвээр байх ёстой тул өв залгамжлал нь хувийн байх ёстой.

Нээлттэй болон хаалттай өв залгамжлалыг ашиглахад зорьж буй зорилго нь өөр өөр байдаг. Нээлттэй өв залгамжлалыг интерфэйс болон хэрэгжилтийн өв залгамжлалд ашигладаг бол хаалттай удамшил нь зөвхөн хэрэгжилтийн удамшилд ашиглагддаг.

#оруулна анги FahrenheitSensor ( public: float getFahrenheitTemp() ( float t = 32.0; // ... return t; ) protected: void adjust() () // мэдрэгчийг тохируулах (хамгаалагдсан арга) ); class Sensor ( public: virtual ~Sensor() () virtual float getTemperature() = 0; virtual void adjust() = 0; ); анги Адаптер: нийтийн мэдрэгч, хувийн FahrenheitSensor ( нийтийн: Адаптер() ( ) float getTemperature() ( буцах (getFahrenheitTemp()-32.0)*5.0/9.0; ) хүчингүй болгох () ( FahrenheitSensor::adjust(); ) ); int main() ( Мэдрэгч * p = шинэ адаптер(); p->тохируулга(); cout<< "Celsius temperature = " << p->getTemperature()<< endl; delete p; return 0; }

Адаптерийн загварыг хэрэглэсний үр дүн

Адаптерийн загварын давуу тал

  • Адаптерийн загвар нь танд тохирохгүй интерфэйсийг ашиглах боломжтой хэлбэрт тохируулснаар одоо байгаа кодыг дахин ашиглах боломжийг олгодог.

Адаптерийн загварын сул талууд

  • Үйлчлүүлэгчийн дуудлагууд ба/эсвэл дамжуулсан параметрүүд нь тохируулж буй объектод функциональ захидал харилцаагүй бол интерфэйсийг хөрвүүлэх ажил хэцүү байж болно.

Сайн уу! Өнөөдөр бид ярих болно Загварын адаптерийн дизайны загвар. Нэрнээс нь харахад энэ нь ямар нэг зүйлийг баталгаажуулахад үйлчилдэг дасан зохицох, Гэхдээ юу гэж? Мөн энэ нийтлэл танд энэ асуултанд хариулах болно.

Адаптерийн дизайны загварын тодорхойлолт

Програмчлалаас бага зэрэг холдож, харцгаая адаптеруудбодит амьдрал дээр. Жишээлбэл, та гадаадад зарим тоног төхөөрөмж (жишээлбэл, компьютер) худалдаж авсан. Гэртээ ирээд өөр стандартын залгуур манай Оросын залгуурт тохирохгүй байгааг олж мэдэв. Юу хийх вэ? Зөв! Та дэлгүүрт очоод худалдаж авах хэрэгтэй адаптер, үүний тусламжтайгаар та компьютерээ сүлжээнд холбож болно. Тэгэхээр энэ адаптермөн байдаг адаптер. Бид түүнд гадаад залгуур оруулаад, адаптераа сүлжээнд залгахад бүх зүйл маш сайн ажилладаг. Тэдгээр. энэ нь энгийн байдлаар үйлчилдэг давхаргабидний залгуур болон гадаад залгуур хооронд.

Тиймээс та үүнийг ойлгосон гэж бодож байна адаптер гэж юу вэАмьдралд. Програмчлалын хувьд энэ нь адилхан.

PHP дээр адаптер хэрэгжүүлэх жишээ

iMain интерфейс (
нийтийн функц илгээх();
}

iAdaptee интерфейс (
нийтийн үйл ажиллагааны лавлагаа();
}

Class Adaptee нь iAdaptee (
нийтийн үйл ажиллагааны лавлагаа() (
буцаах __CLASS__."::".__METHOD__;
}
}

Ангийн адаптер нь iMain (
хамгаалагдсан $adaptee = null;

Нийтийн функц __construct() (
$this->adaptee = new Adaptee();
}

Нийтийн функц send() (
$this->adaptee->inquiry();
}
}

$ зорилго = шинэ адаптер();
echo $goal->send(); // "Дасан зохицох:: лавлагаа"
?>

Тэгэхээр энд бидний код байна. Үүнийг олж мэдье. Бидэнд интерфэйс бий iMain, үйлчлүүлэгчийн код үүнтэй ажиллах боломжтой. Дараа нь бид интерфейстэй болно iAdaptee, үүнтэй үйлчлүүлэгчийн код ажиллах боломжгүй, гэхдээ бид түүнтэй ямар нэгэн байдлаар харилцах хэрэгтэй. Дараа нь бид хичээлтэй Дасан зохицох iAdapteeмөн дотор нь гэдэг арга байдаг лавлагаа, энэ нь зүгээр л шиг мөрийг буцаана АНГИ::АРГА. Энд бид ангидаа ирлээ Адаптер, интерфэйсийг өвлөн авдаг iMain. Дотор нь бид хамгаалагдсан өмчийг бий болгодог дасан зохицох, тэнцүү null. Дараа нь байгуулагч дээр бид ангийн объектыг үүсгэдэг Дасан зохицохмөн үүнийг бидний хамгаалагдсан өмчид бичээрэй. Аргын хувьд илгээхБид аргын дуудлагыг буцаана лавлагаа.

Тэгээд л болоо. Одоо бид адаптер объектоо үүсгэж, аргыг дууддаг илгээх.

Тэдгээр. Гол санаа нь бид нэг интерфэйстэй ажиллах боломжтой боловч нөгөөтэй нь ажиллах боломжгүй бөгөөд энэ интерфейстэй ямар нэгэн байдлаар харилцахын тулд бид үүнийг бий болгодог. адаптер, бидний даалгавраа хэрэгжүүлэх давхарга.

Дүгнэлт

Одоо танд бүх зүйл маш төвөгтэй, хэцүү мэт санагдаж магадгүй ч тийм биш юм. Та адаптерийн утгыг ойлгож байгаа гэж бодож байна, гэхдээ одоо танд илүү их дадлага хэрэгтэй. Энэ нийтлэлд өгөгдсөн кодыг дахин харж, ойлгохыг хичээ. Үүнийг мөр мөрөөр нь дамжуулж, орчуулагч мэт уншаарай php. Түүнчлэн, энэ загварыг энд маш олон удаа ашигладаг тул зарим хүрээний кодыг харахыг зөвлөж байна.

Энэ нэлээд урт нийтлэлийг дуусгаж байна. Анхаарал тавьсанд баярлалаа!