Бір қызмет көрсетілетін келушілер үлгісі - Single-serving visitor pattern

Жылы компьютерлік бағдарламалау, бір реттік келушілер үлгісі Бұл дизайн үлгісі. Оның мақсаты а-ны іске асыруды оңтайландыру келуші бөлінген, бір рет қана пайдаланылған, содан кейін жойылған (бұл келушілердің көпшілігінде).

Қолданылу мүмкіндігі

Бір қызмет көрсетілетін келушілер үлгісі келушілердің жадында қалудың қажеті жоқ болған кезде қолданылуы керек. Бұл объектілер иерархиясына бару кезінде жиі кездеседі (мысалы, кезде келушілер үлгісі бірге қолданылады композициялық өрнек ) бір тапсырманы орындау, мысалы, 3D көріністегі камералар санын санау.

Тұрақты келушілер үлгісі келуші есте сақтау керек болған кезде қолданылуы керек. Бұл келушіні кейінірек пайдалану үшін (мысалы, 3D көрінісін көрсетушінің көрсету параметрлерін сақтау үшін) жадында сақталуы керек бірнеше параметрлермен конфигурацияланған кезде пайда болады.

Алайда, егер мұндай бағдарламада бір ғана бағдарлама болуы керек болса, оны бір реттік келуші ретінде де, синглтон. Бұл ретте, бір реттік келушіні кейінірек оның параметрлері өзгертілмеген жағдайда шақыруға болатындығына кепілдік беріледі (бұл жағдайда «бір реттік қызмет» - бұл тілді теріс пайдалану, өйткені келушіні бірнеше рет қолдануға болады).

Пайдалану мысалдары

Бір рет қызмет ететін келуші статикалық әдістердің аралық қызметі арқылы шақырылады.

  • Параметрлерсіз:
     Элемент* елем; SingleServingVisitor::қолдану_ке(елем);
  • Параметрлермен:
     Элемент* елем; ТҮРІ парам1, парам2; SingleServingVisitor::қолдану_ке(елем, парам1, парам2);
  • Синглтон ретінде жүзеге асыру:
     Элемент* елем; ТҮРІ парам1, парам2; SingleServingVisitor::set_param1(парам1); SingleServingVisitor::set_param2(парам2); SingleServingVisitor::қолдану_ке(елем);

Салдары

Артықшылықтары

  • «Зомби» нысандары жоқ. Бір реттік келушімен келушілер қажет болған жағдайда бөлініп, пайдасыз болған кезде жойылуы қамтамасыз етіледі.
  • Келушіге қарағанда қарапайым интерфейс. Келуші «қоңырау» арқылы жасалады, пайдаланылады және тегін қолдану_ке статикалық әдіс.

Минус

  • Қайта бөлу. Әр қоңырау кезінде қолдану_ке әдісі, бір қызмет көрсетілетін келуші жасалады, содан кейін оны алып тастайды, бұл көп уақытты алады. Керісінше, синглтон тек бір ғана бөлуді орындайды.

Іске асыру (C ++ тілінде)

Негізгі іске асыру (параметрлерсіз)

// Декларациясынып Элемент;сынып Элемент;сынып Элемент B;сынып SingleServingVisitor;... // [[келушілер үлгісімен]] бірдей.// Анықтамасынып SingleServingVisitor {қорғалған:    SingleServingVisitor();қоғамдық:    ~SingleServingVisitor();    статикалық жарамсыз қолдану_ке(Элемент*);    виртуалды жарамсыз бару_элементА(Элемент*) = 0;    виртуалды жарамсыз бару_ElementB(Элемент B*) = 0;}// Іске асыружарамсыз SingleServingVisitor::қолдану_ке(Элемент* елем) {    SingleServingVisitor ssv;    елем.қабылдау(ssv);}

Параметрлерді өткізу

Егер бір қызмет көрсететін қонақты инициализациялау керек болса, онда параметрлерді статикалық әдіс арқылы өткізу керек:

жарамсыз SingleServingVisitor::қолдану_ке(Элемент* елем, ТҮРІ парам1, ТҮРІ парам2, ...) {    SingleServingVisitor ssv(парам1, парам2, ...);    елем.қабылдау(&ssv);}

Синглтон ретінде жүзеге асыру

Бұл іске асыру мыналарды қамтамасыз етеді:

  • бір реттік келушінің ең көп жағдайда болуы
  • келушіге кейінірек қол жеткізуге болатындығы
// Анықтамасынып SingleServingVisitor {қорғалған:    статикалық SingleServingVisitor* instansiya_;    ТҮРІ param1_;    ТҮРІ param2_;    SingleServingVisitor();    статикалық SingleServingVisitor* get_instance();    // Ескерту: get_instance әдісі көпшілікке қажет емесқоғамдық:    ~SingleServingVisitor();    статикалық жарамсыз қолдану_ке(Элемент*);    // параметрлерге қол жеткізудің статикалық әдістері    статикалық жарамсыз set_param1(ТҮРІ);    статикалық жарамсыз set_param2(ТҮРІ);    виртуалды жарамсыз бару_элементА(Элемент*) = 0;    виртуалды жарамсыз бару_ElementB(Элемент B*) = 0;}// Іске асыруSingleServingVisitor* SingleServingVisitor::instansiya_ = ЖОҚ;SingleServingVisitor* SingleServingVisitor::get_instance() {    егер (бұл->instansiya_ == ЖОҚ)        бұл->instansiya_ = жаңа SingleServingVisitor();    қайту бұл->instansiya_;}жарамсыз SingleServingVisitor::қолдану_ке(Элемент* елем) {    елем->қабылдау(get_instance());}жарамсыз SingleServingVisitor::set_param1(ТҮРІ парам1) {    getInstance()->param1_ = парам1;}жарамсыз SingleServingVisitor::set_param2(ТҮРІ парам2) {    getInstance()->param2_ = парам2;}

Өзара байланысты заңдылықтар