Strategie (Entwurfsmuster) - de.LinkFang.org

Strategie (Entwurfsmuster)

Die Strategie (englisch strategy) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung. Es gehört zur Kategorie der Verhaltensmuster (englisch behavioral design patterns) und definiert eine Familie austauschbarer Algorithmen.[1] Es ist eines der sogenannten GoF-Muster.

Inhaltsverzeichnis

Verwendung


Strategie-Objekte werden ähnlich wie Klassenbibliotheken verwendet. Im Gegensatz dazu handelt es sich jedoch nicht um externe Programmteile, sondern um integrale Bestandteile des eigentlichen Programms, die deshalb als eigene Objekte definiert wurden, damit sie durch andere Algorithmen ausgetauscht werden können.

Meistens wird eine Strategie durch Klassen umgesetzt, die eine bestimmte Schnittstelle implementieren. In Sprachen wie Smalltalk, in denen auch der Programmcode selbst in Objekten abgelegt werden kann, kann eine Strategie aber auch durch solche Code-Objekte realisiert werden.

Die Verwendung von Strategien bietet sich an, wenn

UML-Diagramm


Strategie.png

Erklärung der Akteure

Die Klasse Strategie definiert nur eine Schnittstelle (interface) für alle unterstützten Algorithmen. Die Implementierung der eigentlichen Algorithmen finden sich erst in den Ableitungen wieder (konkrete Strategie).

Der Kontext hält eine Variable der Schnittstelle Strategie, die mit einer Referenz auf das gewünschte Strategieobjekt belegt ist. Auf diese Weise wird der konkrete Algorithmus über die Schnittstelle eingebunden und kann bei Bedarf selbst zur Laufzeit noch dynamisch gegen eine andere Implementierung ausgetauscht werden.

Vorteile


Nachteile


Beispiel


Als Beispiel kann ein Steuerberechnungsprogramm dienen, das die Berechnung von Steuersätzen möglichst in Strategie-Objekte auslagern sollte, um einfach länderabhängig konfigurierbar zu sein.

Ein anderes Beispiel wäre die Speicherung eines Dokuments oder einer Grafik in verschiedenen Dateiformaten.

Auch ein Packer, der verschiedene Kompressionsalgorithmen unterstützt, kann mit Hilfe von Strategie implementiert sein. Bei Java wird das Entwurfsmuster zum Beispiel zur Delegierung des Layouts von AWT-Komponenten an entsprechende LayoutManager (BorderLayout, FlowLayout etc.) verwendet.

Weitere Beispiele (außerhalb der OOP-Welt):

Programmbeispiele


Beispiel in C++

//
// g++ -std=gnu++11 strategy.cpp -o strategy
//
#include <iostream>
#include <memory>using namespace std;class Strat {
public:
    virtual void operator()() = 0;
    virtual ~Strat() {}
};class Kontext {
    shared_ptr<Strat> _strat;
public:
    Kontext() : _strat(nullptr) {}
    void setStrategy(shared_ptr<Strat> strat)  { _strat = strat; }
    void strategy()  { if (_strat) (*_strat)(); }
};class Strategy1 : public Strat {
public:
    void operator()() { cout << "Foo\n"; }
};class Strategy2 : public Strat {
public:
    void operator()() { cout << "Bar\n"; }
};class Strategy3 : public Strat {
public:
    void operator()() { cout << "FooBar\n"; }
};
int main() {
    Kontext * k = new Kontext();    k->setStrategy( shared_ptr<Strat>(new Strategy1) );
    k->strategy();    k->setStrategy( shared_ptr<Strat>(new Strategy2) );
    k->strategy();    k->setStrategy( shared_ptr<Strat>(new Strategy3) );
    k->strategy();
}

Java

class Klient {
	public static void main(final String[] ARGS) {
		final Kontext k = new Kontext();		k.setStrategie(new KonkreteStrategieA());
		k.arbeite();	// "Weg A"
		k.setStrategie(new KonkreteStrategieB());
		k.arbeite();	// "Weg B"
	}
}
class Kontext {
	private Strategie strategie = null;	public void setStrategie(final Strategie STRATEGIE) {
		strategie = STRATEGIE;
	}	public void arbeite() {
		if (strategie != null) {
			strategie.algorithmus();
		}
	}
}interface Strategie {
	void algorithmus();
}class KonkreteStrategieA implements Strategie {
	public void algorithmus() {
		System.out.println("Weg A");
	}
}class KonkreteStrategieB implements Strategie {
	public void algorithmus() {
		System.out.println("Weg B");
	}
}

Ruby

class Context
  private
  attr_writer :strategy  public
  def initialize(strategy)
    @strategy = strategy
  end  def execute
      unless @strategy.respond_to?('execute')
        raise NotImplementedError,'Strategie-Objekt antwortet nicht auf die execute-Methode'
      end
      @strategy.execute
  end
endclass StrategyA
  def execute
     puts 'Der normale Weg'
  end
endclass StrategyB
  def execute
     puts 'Ein anderer Weg'
  end
endclass StrategyC
  def execute
     puts 'Noch ein anderer Weg'
  end
enda = Context.new(StrategyA.new)
a.execute
# Der normale Wegb = Context.new(StrategyB.new)
b.execute
# Ein anderer Wegc = Context.new(StrategyC.new)
c.execute
# Noch ein anderer Weg

Python

class Context:
    def __init__(self, strategy):
        self.strategy = strategy    def execute(self, a, b):
        return self.strategy(a, b)
class AddStrategy:
    def __call__(self, a, b):
        return a + bclass SubStrategy:
    def __call__(self, a, b):
        return a - bcontext = Context(AddStrategy())
print('4 + 3 =', context.execute(4, 3))
# 4 + 3 = 7context.strategy = SubStrategy()
print('4 - 3 =', context.execute(4, 3))
# 4 - 3 = 1

Verwandte Entwurfsmuster


Weblinks


Einzelnachweise


  1. Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Entwurfsmuster. 5. Auflage. Addison-Wesley, 1996, ISBN 3-8273-1862-9, S. 373.



Kategorien: Verhaltensmuster (Software) | Viererbande-Entwurfsmuster



Quelle: Wikipedia - https://de.wikipedia.org/wiki/Strategie (Entwurfsmuster) (Autoren [Versionsgeschichte])    Lizenz: CC-by-sa-3.0

Veränderungen: Alle Bilder und die meisten Designelemente, die mit ihnen in Verbindung stehen, wurden entfernt. Icons wurden teilweise durch FontAwesome-Icons ersetzt. Einige Vorlagen wurden entfernt (wie „Lesenswerter Artikel“, „Exzellenter Artikel“) oder umgeschrieben. CSS-Klassen wurden zum Großteil entfernt oder vereinheitlicht.
Wikipedia spezifische Links, die nicht zu Artikeln oder Kategorien führen (wie „Redlink“, „Bearbeiten-Links“, „Portal-Links“) wurden entfernt. Alle externen Links haben ein zusätzliches FontAwesome Icon erhalten. Neben weiteren kleinen Designanpassungen wurden Media-Container, Karten, Navigationsboxen, gesprochene Versionen & Geo-Mikroformate entfernt.


Stand der Informationen: 21.10.2019 10:30:22 CEST - Wichtiger Hinweis Da die gegebenen Inhalte zum angegebenen Zeitpunkt maschinell von Wikipedia übernommen wurden, war und ist eine manuelle Überprüfung nicht möglich. Somit garantiert LinkFang.org nicht die Richtigkeit und Aktualität der übernommenen Inhalte. Sollten die Informationen mittlerweile fehlerhaft sein oder Fehler in der Darstellung vorliegen, bitten wir Sie darum uns per zu kontaktieren: E-Mail.
Beachten Sie auch : Impressum & Datenschutzerklärung.