Stratégia programtervezési minta

A számítógép-programozásban a stratégia minta (vezérelv mintaként is ismert) egy szoftvertervezési minta, amely lehetővé teszi, hogy egy algoritmus viselkedését a futás során válasszuk meg. A stratégia minta meghatározza az algoritmusok egy családját, egységbe foglal minden algoritmust, és a családon belül cserélhetővé teszi ezeket az algoritmusokat. A stratégia segítségével az algoritmus az őt használó kliensektől függetlenül változhat, miután az megtette a beállításokat. A stratégia minta az egyike a Design Patterns könyvben[1] szereplő mintáknak, mely népszerűsítette a minták használatát a szoftvertervezés folyamatában.

Például egy osztály, mely bejövő adatokat érvényesít, stratégiai mintát használhat a validációs algoritmus kiválasztására a bejövő adat típusa, az adat forrása, felhasználói választás vagy más megkülönböztető tényező alapján. Ezek a tényezők nem minden esetben ismertek a futtatás előtt, és szükségessé válhat radikálisan eltérő érvényesítési módok használata. A validációs stratégiákat, melyeket külön egységbe zártunk a validáló objektumoktól, a rendszer más területéről származó validációs objektumok (vagy akár más rendszerek) is használhatják kódduplikáció nélkül.

A programozási nyelvekben alapvető követelmény, hogy képes legyen az adatstruktúrában található kódra mutató referenciák tárolására és elérésére. Ennek elérését olyan mechanizmusok segítik, mint a natív függvény pointerek, elsődleges típusú függvények, osztályok vagy osztály példányok az objektumorientált programozási nyelvekben, vagy mint a nyelv implementációs belső tárolójának elérése önelemzés (reflexió, reflection) segítségével.

Felépítése

Stratégia tervezési minta UML ábrája
Stratégia tervezési minta LePUS3-ban (legend)

Példa

C#

namespace IVSR.Designpattern.Strategy {
    //A stratégiák interfésze
    public interface ICalculateInterface {
       int Calculate(int value1, int value2);
    }

    //stratégiák
    //Stratégia 1: Mínusz
    class Minus : ICalculateInterface {
        public int Calculate(int value1, int value2) {
            return value1 - value2;
        }
    }

    //Stratégia 2: Plusz
    class Plus : ICalculateInterface {
        public int Calculate(int value1, int value2) {
            return value1 + value2;
        }
    }

    //A kliens
    class CalculateClient {
        private ICalculateInterface calculateStrategy;

        //Konstruktor: az interfészhez rendeli a stratégiá
        public CalculateClient(ICalculateInterface strategy) {
            this.calculateStrategy = strategy;
        }

        //Stratégia végrehajtása
        public int Calculate(int value1, int value2) {
            return calculateStrategy.Calculate(value1, value2);
        }
    }

    //Inicializálás
    protected void Page_Load(object sender, EventArgs e) {
        CalculateClient minusClient = new CalculateClient(new Minus());
        Response.Write("<br />Minus: " + minusClient.Calculate(7, 1).ToString());

        CalculateClient plusClient = new CalculateClient(new Plus());
        Response.Write("<br />Plus: " + plusClient.Calculate(7, 1).ToString());
    }
}

Java

A következő példa Java programozási nyelvben íródott.

package javaapplication8;

import java.util.ArrayList;
import java.util.List;

 // Minta a Stratégia tervezési mintára
public class JavaApplication8 {
    public static void main(String[] args){
        Customer a = new Customer();
        a.setStrategy(new NormalStrategy());
        
        // Normál számlázás
        a.add(1.2,1);
        
        // Happy Hour inditása
        a.setStrategy(new HappyHourStrategy());
        a.add(1.2,2);
        
        // Új ügyfél
        Customer b = new Customer();
        b.setStrategy(new HappyHourStrategy());
        b.add(0.8,1);
        // Az ügyfél fizet
        a.printBill();

        // Happy Hour vége
        b.setStrategy(new NormalStrategy());
        b.add(1.3,2);
        b.add(2.5,1);
        b.printBill();
        
    }
}

class Customer{
    private List<Double> drinks;
    private BillingStrategy strategy;

    public Customer() {
        this.drinks = new ArrayList<Double>();
    }

    // Új elem az étlapra
    public void add(double price, int quantity){
        drinks.add(price*quantity);
    }

     // Számla kifizetése
    public void printBill(){
        System.out.println("Total due: " + strategy.sum(drinks));
        drinks.clear();
    }

     // Stratégia beállítása
    public void setStrategy(BillingStrategy strategy) {
        this.strategy = strategy;
    }

}

interface BillingStrategy{
     // A fogyasztott italok összegzett ára
    public double sum(List<Double> drinks);
}

// Normál számlátási stratégia (változatlan árakon)
class NormalStrategy implements BillingStrategy{
    public double sum(List<Double> drinks) {
        double sum = 0;
        for(Double i : drinks){
            sum += i;
        }
        return sum;
    }
}

 // Happy hour stratégia(10% engedmény)
class HappyHourStrategy implements BillingStrategy{
    public double sum(List<Double> drinks) {
        double sum = 0;
        for(Double i : drinks){
            sum += i;
        }
        return sum*0.9;
    }
}

Egy sokkal egyszerűbb példa a 'modern Javában' (Java 8 vagy újabb) a lambdák használata[2]

Stratégia és a nyílt-zárt alapelv

Gyorsulás és fék viselkedések minden egyes új auto modellben deklarálva vannak.

A stratégia minta szerint az osztály viselkedését nem szabad örökítenünk. Ehelyett egységbe kell zárnunk interfészek alkalmazásával. Például vegyünk egy Autó osztályt. Az Autó két lehetséges funkciója a fék és a gyorsulás.

Mivel a gyorsulás és a fék viselkedése gyakran eltérő a különböző modellek esetén, az általános felfogás szerint ezeket a viselkedéseket külön osztályokba sorolnánk, amelyek ugyanazt az interfészt valósítják meg, a kód öröklésének kiiktatásával. Ennek a megközelítésnek viszont jelentős hátrányai vannak: minden egyes új autómodellhez újra kell értelmezni a gáz és a fék viselkedését. Ezen viselkedések kezelésével járó munka a modellek számának a növekedésével jelentősen megnő, és kód-duplikációhoz vezethet. Továbbá nem egyszerű feladat meghatározni minden modell pontos viselkedését anélkül, hogy a bennük megírt kódot külön megvizsgálnunk.

A stratégia minta öröklés helyett kompozíciót használ. Itt a viselkedést különálló interfészként és specifikus osztályokként definiáljuk, melyek ezeket az interfészeket valósítják meg. Ez lehetővé teszi a viselkedés és a viselkedést alkalmazó osztály jobb szétválasztását. A viselkedést anélkül tudjuk megváltoztatni, hogy betörnénk az osztályt, ami használja, illetve az osztályok lecserélhetik viselkedésüket a konkrét megvalósítás megváltoztatása által, anélkül hogy a kódot jelentőségteljesen megváltoztatnánk. A viselkedés változhat futási időben és tervezési időben is. Például az autó objektum fék viselkedését megváltoztathatjuk BrakeWithABS() -ről Brake() -re azáltal, hogy megváltoztatjuk a brakeBehavior tagot az alábbi módon:

brakeBehavior = new Brake();
/* Algoritmusok egységbezárt családja
 * Interfész és annak megvalósításai
 */
public interface IBrakeBehavior {
    public void brake();
}

public class BrakeWithABS implements IBrakeBehavior {
    public void brake() {
        System.out.println("Brake with ABS applied");
    }
}

public class Brake implements IBrakeBehavior {
    public void brake() {
        System.out.println("Simple Brake applied");
    }
}

 
/* Kliens mely a fenti algoritmusokat váltakozva használhatja */
public abstract class Car {
    protected IBrakeBehavior brakeBehavior;

    public void applyBrake() {
        brakeBehavior.brake();
    }

    public void setBrakeBehavior(IBrakeBehavior brakeType) {
        this.brakeBehavior = brakeType;
    }
}

/* 1. Kliens mely a fenti Bake algoritmust használja konstruktorban */
public class Sedan extends Car {
    public Sedan() {
        this.brakeBehavior = new Brake();
    }
}

/* 2. Kliens mely a BrakeWithABS algoritmust használja konstruktorban */
public class SUV extends Car {
    public SUV() {
        this.brakeBehavior = new BrakeWithABS();
    }
}

/* Használunk egy PéldaAutót (carExample) */
public class CarExample {
    public static void main(String[] args) {
        Car sedanCar = new Sedan();
        sedanCar.applyBrake();  // "Brake" osztály meghívása
 
        Car suvCar = new SUV();
        suvCar.applyBrake();    // "BrakeWithABS" osztály meghívása
 
        // fék viselkedésének dinamikus beallítása
        suvCar.setBrakeBehavior( new Brake() );
        suvCar.applyBrake();    // "Brake" osztály meghívása
    }
}

Ez a megoldás nagyobb rugalmasságot biztosít és összhangban van a Nyitva-Zárt Alapelvvel, mely kimondja, hogy az osztályoknak nyitottnak kell lenni a kiterjesztésekre, de zártnak a módosításokra.

Források

Commons:Category:Strategy (design pattern)
A Wikimédia Commons tartalmaz Stratégia programtervezési minta témájú médiaállományokat.
  1. Eric Freeman, Elisabeth Freeman, Kathy Sierra and Bert Bates, Head First Design Patterns, First Edition, Chapter 1, Page 24, O'Reilly Media, Inc, 2004. ISBN 978-0-596-00712-6
  2. Wikikönyvek: Computer Science Design Patterns/Strategy

További információk

Az angol Wikikönyvekben
további információk találhatók

Fordítás

Ez a szócikk részben vagy egészben a Strategy pattern című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

Read other articles:

Comics character Andrew BennettCover of The House of Mystery #290 (March 1981), art by Joe Kubert.Publication informationPublisherDC ComicsFirst appearanceThe House of Mystery #290 (March, 1981)Created byJ. M. DeMatteis (writer)Tom Sutton (artist)In-story informationFull nameAndrew BennettTeam affiliationsJustice League DarkTeam 13Justice LeagueAbilitiesTraditional vampiric attributes such as immortality and healing, superhuman strength and speed, heightened senses (including night vision), h...

 

George Tenet Direktur CIAMasa jabatan16 Desember 1996 – 11 Juli 2004Pj: 16 Desember 1996 – 11 Juli 1997[1]PresidenBill ClintonGeorge W. BushWakilJohn A. GordonJohn E. McLaughlin PendahuluJohn M. DeutchPenggantiPorter GossWakil Direktur Badan Intelijen PusatMasa jabatan3 Juli 1995 – 11 Juli 1997[1]PresidenBill Clinton PendahuluWilliam O. StudemanPenggantiJohn A. Gordon Informasi pribadiLahirGeorge John Tenet5 Januari 1953 (umur 71)New York City, New...

 

Untuk kelompok triad di Indonesia, lihat Pacinko. Arena pachinko di Akihabara, Tokyo. Pachinko (パチンコcode: ja is deprecated ) adalah permainan ketangkasan asal Jepang yang digunakan sebagai bentuk rekreasi permainan arkade atau sebagai mesin perjudian. Mesin pachinko menyerupai mesin pinball yang diletakkan vertikal, tetapi tidak memiliki flipper seperti halnya mesin pinball, sedangkan bola yang dipakai adalah bola-bola logam berukuran kecil dalam jumlah besar. Arena pachinko disebut p...

Funiculaire au sommet de Charlannes Le Funiculaire de la Bourboule a fonctionné dans cette ville entre 1902 et 1958. La construction était due à l'initiative de Jean Claret[1], ingénieur et entrepreneur Lyonnais. Un tramway à traction électrique (Jean Claret) reliait le centre-ville à La gare basse du funiculaire entre 1902 et 1910. La ligne La Bourboule - Sommet de Charlannes (587 mètres de long): ouverture 1902[1]; La gare basse du funiculaire était reliée au centre de la vil...

 

Probability distribution Dirichlet distribution Probability density functionParameters K ≥ 2 {\displaystyle K\geq 2} number of categories (integer) α = ( α 1 , … , α K ) {\displaystyle {\boldsymbol {\alpha }}=(\alpha _{1},\ldots ,\alpha _{K})} concentration parameters, where α i > 0 {\displaystyle \alpha _{i}>0} Support x 1 , … , x K {\displaystyle x_{1},\ldots ,x_{K}} where x i ∈ [ 0 , 1 ] {\displaystyle x_{i}\in [0,1]} and ȡ...

 

American manufacturer of microprocessors The factual accuracy of parts of this article (those related to article) may be compromised due to out-of-date information. Please help update this article to reflect recent events or newly available information. (April 2012) Zilog, Inc.Zilog Logo 2019Company typeSubsidiaryIndustrySemiconductorsGenreCPU, microprocessorFounded1974FounderFederico Faggin and Ralph UngermannHeadquartersMilpitas, California,[1]United StatesKey peopleFederico FagginC...

Motel WoodstockScena del film.Titolo originaleTaking Woodstock Lingua originaleinglese Paese di produzioneStati Uniti d'America Anno2009 Durata125 min Generedrammatico, musicale RegiaAng Lee SoggettoElliot Tiber, Tom Monte SceneggiaturaJames Schamus ProduttoreAng Lee, James Schamus Casa di produzioneFocus Features Distribuzione in italianoBiM Distribuzione FotografiaÉric Gautier MontaggioTim Squyres MusicheDanny Elfman ScenografiaDavid Gropman Interpreti e personaggi Demetri Martin: Elli...

 

Эта страница или раздел содержит текст на языках стран Азии. Если у вас отсутствуют необходимые шрифты, некоторые символы могут отображаться неправильно. Иенг Мауликхмер. អៀង មូលី Старший министр, помощник премьер-министра Камбоджи с 2008 Министр информации Камбод...

 

Koordinat: 40°29′N 127°12′E / 40.483°N 127.200°E / 40.483; 127.200 (Rawa Jangjin) Pertempuran Rawa Chosin, juga dikenal sebagai Kampanye Rawa Chosin atau Pertempuran Danau Jangjin (Hangul: 장진호 전투; Hanja: 長津湖戰鬪; RR: Jangjinho jeontu; MR: Changjinho chŏnt'u), adalah sebuah pertempuran penting dalam Perang Korea.[a] Nama Chosin berasal dari pengucapan Jepang Chōshin, alih-alih pe...

土库曼斯坦总统土库曼斯坦国徽土库曼斯坦总统旗現任谢尔达尔·别尔德穆哈梅多夫自2022年3月19日官邸阿什哈巴德总统府(Oguzkhan Presidential Palace)機關所在地阿什哈巴德任命者直接选举任期7年,可连选连任首任萨帕尔穆拉特·尼亚佐夫设立1991年10月27日 土库曼斯坦土库曼斯坦政府与政治 国家政府 土库曼斯坦宪法 国旗 国徽 国歌 立法機關(英语:National Council of Turkmenistan) ...

 

French royal (1725–1785) Not to be confused with Louis Philippe I, King of the French. Louis Philippe IFirst Prince of the BloodDuke of OrléansPortrait by Alexander Roslin, c. 1770BornLouis Philippe d'Orléans, Duke of Chartres(1725-05-12)12 May 1725Palace of Versailles, FranceDied18 November 1785(1785-11-18) (aged 60)Château de Sainte-Assise à Seine-Port, FranceBurialVal-de-Grâce, ParisSpouse Louise Henriette de Bourbon ​ ​(m. 1743; died 1759&...

 

У этого термина существуют и другие значения, см. Монотип. Моноти́п (англ. monotype от моно- и др.-греч. τύπος — отпечаток) — автоматическая буквоотливная наборная машина, изготовляющая набор в виде строк, состоящих из отдельных литер и шпаций. Разновидность полиграфи�...

وزارة الثقافة العراقية   تفاصيل الوكالة الحكومية البلد العراق  الإدارة منصب المدير وزير الثقافة والسياحة والآثار  [لغات أخرى]‏  الوزراء المسؤولون أحمد فكاك البدراني موقع الويب mocul.gov.iq الموقع الرسمي تعديل مصدري - تعديل   وزارة الثقافة العراقية هي إحدى وزا�...

 

For the political parties in Australia and Poland, see Reason Party. Libertarian political party in Germany Party of Reason Partei der VernunftLeaderFriedrich DominicusGeneral SecretaryDirk HesseDeputy leadersEnrico Pietzsch,Charles KrügerExecutive directorMaria ZankeTreasurerAlexander MalchowAdditional executive committee membersGeorg Semmler, Stefanie Kaiser, Lilia KalaschnikovaFounded30 May 2009 (2009-05-30)HeadquartersMarkgrafenstr. 1576646 BruchsalGermanyMembership (2011)...

 

Global view centered on North America North America is the third largest continent, and is also a portion of the third largest supercontinent if North and South America are combined into the Americas and Africa, Europe, and Asia are considered to be part of one supercontinent called Afro-Eurasia. With an estimated population of 580 million and an area of 24,709,000 km2 (9,540,000 mi2), the northernmost of the two continents of the Western Hemisphere[1] is bounded by the Pac...

2009 American filmThe TerminatorsDirected byXavier S. PuslowskiScreenplay byDavid Michael LattStory byWilliam MoreyProduced byDavid Michael Latt David RimawiPaul BalesStarringJeremy London A Martinez Paul LoganCinematographyMark AtkinsDistributed byThe AsylumRelease date April 28, 2009 (2009-04-28) Running time90 minutesCountryUnited StatesLanguageEnglishBudget$250,000[1] The Terminators is a 2009 American science fiction film directed by Xavier S. Puslowski, starring J...

 

Corpi Santi di Milanoex comuneCorpi Santi di Milano – VedutaLa distribuzione dei cimiteri milanesi (in seguito soppressi), al di fuori delle mura cittadine, nel comune dei Corpi Santi LocalizzazioneStato Italia Provincia Milano CircondarioMilano MandamentoMilano AmministrazioneData di istituzione21 luglio 1781 Data di soppressione1º settembre 1873 TerritorioCoordinate45°28′27.5″N 9°08′25.01″E45°28′27.5″N, 9°08′25.01″E (Corpi Santi di Milano) Superficie6...

 

Artikel ini sudah memiliki daftar referensi, bacaan terkait, atau pranala luar, tetapi sumbernya belum jelas karena belum menyertakan kutipan pada kalimat. Mohon tingkatkan kualitas artikel ini dengan memasukkan rujukan yang lebih mendetail bila perlu. (Pelajari cara dan kapan saatnya untuk menghapus pesan templat ini) OKOОКОInformasi umumStatusSelesaiJenisMixed useGaya arsitekturPostmodernismeLokasi Pusat Bisnis Internasional MoskwaMoskwa, RusiaKoordinat55°44′58.48″N 37°32′3.69″...

CloverfieldPoster rilis teaterSutradaraMatt ReevesProduserJ. J. AbramsBryan BurkDitulis olehDrew GoddardPemeranMichael Stahl-DavidT. J. MillerJessica LucasOdette YustmanLizzy CaplanMike VogelDistributorParamount PicturesTanggal rilis18 Januari 2008[1]Durasi85 min.NegaraBahasaInggrisRusiaAnggaran$30 juta[2]PendapatankotorDomestic$78,778,933Foreign$74,180,860Worldwide$152,959,793[3] Cloverfield adalah sebuah film monster/horor produksi Amerika Serikat yang diluncurkan pa...

 

2017 mass shooting in Cincinnati, Ohio Cincinnati nightclub shootingLocation within CincinnatiCincinnatiCincinnati nightclub shooting (Ohio)Show map of OhioCincinnati nightclub shooting (the United States)Show map of the United StatesLocation4601 Kellogg Ave, Cincinnati, Ohio, USCoordinates39°6′N 84°31′W / 39.100°N 84.517°W / 39.100; -84.517DateMarch 26, 2017 1:30 a.m EDTTargetUnknownAttack typemass shootingDeaths2 (including one of the suspects)Injured15 In th...