Dramatik einer Vulkanlandschaft

Ich habe ein altes Bild gefunden, welches ich in Neuseeland aufgenommen habe. Im Original sieht es ziemlich langweilig und trist aus, obwohl es sich um eine bedrohende und überwältigende Situation handelt. Die hier aufgenommene Szene zeigt die sogenannten „craters oft he moon“ in der Nähe von Taupo / Neuseeland. Aus kleinen Kratern im Erdboden strömt überall Dampf heraus. Dazu muss man sich noch die Geräuschkulisse einer Dampflok vorstellen.

Originalbild der "Craters of the Moon" in Taupo / Neuseeland

Vulkanlandschaft

Durch begradigen des Horizontes sowie einer Verlaufsmaske von oben nach unten, die die Helligkeit und Belichtung senkt bekommt man einen bedrohlicheren Eindruck von der Szene. Um dies alles noch zu unterstützen wurde die Sättigung und der Kontrast noch ein wenig erhöht.

Originalbild der "Craters of the Moon" in Taupo / Neuseeland

Vulkanlandschaft


Veröffentlicht unter Fotografie, Natur | Verschlagwortet mit , , | Hinterlasse einen Kommentar

Einsame Dose am Weidezaun…

Gestern war ich kurz im Wald unterwegs. Dabei fiel mir diese Dose ins Auge, die kopfüber an einem Weidezaun hing. Im inneren der Dose hing ein Lappen, der mit einer nicht identifizierbaren Flüssigkeit getränkt war. Vielleicht hat jemand eine Idee, um was es sich hier handelt. Auf jeden Fall fand ich das Motiv sehr interessant.

Dose

Veröffentlicht unter Fotografie, Natur | Verschlagwortet mit , | Hinterlasse einen Kommentar

Actionscript 3 Design Pattern – Dekorierer

Der Decorator (auch Dekorierer) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung und gehört zur Kategorie der Strukturmuster (Structural Patterns). Das Muster ist eine flexible Alternative zur Unterklassenbildung, um eine Klasse um zusätzliche Funktionalitäten zu erweitern.

Die Instanz eines Dekorierers wird vor die zu dekorierende Klasse geschaltet. Der Dekorierer hat die gleiche Schnittstelle wie die zu dekorierende Klasse. Aufrufe an den Dekorierer werden dann verändert oder unverändert weitergeleitet (Delegation), oder sie werden komplett in Eigenregie verarbeitet. Der Dekorierer ist dabei „unsichtbar“, da der Aufrufende gar nicht mitbekommt, dass ein Dekorierer vorgeschaltet ist. (Quelle: Wikipedia)

UML-Diagramm eines Dekorierer-Entwursmusters

UML Dekorierer

In dem folgenden Beispiel handelt es sich um ein Raumschiff-Objekt, welches durch verschiedene Waffen dynamisch zur Laufzeit “dekorieren” lässt, um dadurch die Angriffswerte zu verändern. Als Basis aller Raumschiffe dient uns hier eine abstrakte Klasse vom Typ “AbstractSpaceShip”. Da Actionscript keine “echten” abstrakten Klassen anbietet, erweitere ich den Klassennamen um denn Prefix “Abstract”. Dieses dient nur der Übersichtlichkeit und Wiedererkennbarkeit.

Abstraktes Raumschiff

package de.dirkkoehler.decoraterPattern.spaceShips
{
 
/**
 * abstract class for an virtual space ship
 * @author dkoehler
 */
public class AbstractSpaceShip
{
	/*description of this object, for debugging only*/
	protected var _description : String;
 
	/*firepower of ship*/
	protected var _firePower : uint;
 
	/*cargospace of ship*/
	protected var _cargoSpace : uint;
 
	public function get description() : String
	{
		return _description;
	}
 
	public function get firePower() : uint
	{
		return _firePower;
	}
 
	public function get cargoSpace() : uint
	{
		return _cargoSpace;
	}
}
}

Eine konkrete Klasse des Raumschiffes definiert in diesem Beispiel einige Basiswerte. Diese Deklaration wäre in der Praxis eher unüblich und durch Konstanten definiert, aber es soll nur das Beispiel des Dekorierer vereinfachen.

Konkretes Raumschiff

package de.dirkkoehler.decoraterPattern.spaceShips
{
 
/**
 * concrete spaceship class
 * @author dkoehler
 */
public class FighterShip extends AbstractSpaceShip
{
	public function FighterShip()
	{
		_description = "fighter ship";
		_cargoSpace = 5;
		_firePower = 50;
	}
}
}

Nun kommen wir zum eigentlichen Akteur, dem Dekorierer. Dieser erbt von AbstractSpaceShip, und kann somit die Getter der Basiseigenschaften des Raumschiffes überschreiben.

Abstrakter Dekorierer

package de.dirkkoehler.decoraterPattern.shipDecorater
{
import de.dirkkoehler.decoraterPattern.spaceShips.AbstractSpaceShip;
 
/**
 * abstract decorater class
 * @author dkoehler
 */
public class AbstractShipDecorator extends AbstractSpaceShip
{
	protected var spaceShip : AbstractSpaceShip;
 
	public function AbstractShipDecorator(ship : AbstractSpaceShip)
	{
		spaceShip = ship;
	}
 
	override public function get description() : String
	{
		return spaceShip.description;
	}
 
	override public function get firePower() : uint
	{
		return spaceShip.firePower;
	}
 
	override public function get cargoSpace() : uint
	{
		return spaceShip.cargoSpace;
	}
}
}

Es folgen einige konkrete Dekorierer. Diese überschreiben wiederum die Getter des abstrakten Dekorierers und somit gleichzeitig des Raumschiffes. In diesem Fall werden die Basiseigenschaften durch den Dekorierer modifiziert und zurück gegeben.

Konkreter Laser Dekorierer

package de.dirkkoehler.decoraterPattern.shipDecorater
{
import de.dirkkoehler.decoraterPattern.spaceShips.AbstractSpaceShip;
 
/**
 * concrete ship decorater
 * @author dkoehler
 */
public class LaserDecorater extends AbstractShipDecorator
{
	public function LaserDecorater(ship : AbstractSpaceShip)
	{
		super(ship);
		_firePower = 25;
		_description = "laser";
	}
 
	override public function get description() : String
	{
		return spaceShip.description + " + " + _description;
	}
 
	override public function get firePower() : uint
	{
		return spaceShip.firePower + _firePower;
	}
}
}

Konkreter Raketen Dekorierer

package de.dirkkoehler.decoraterPattern.shipDecorater
{
import de.dirkkoehler.decoraterPattern.spaceShips.AbstractSpaceShip;
 
/**
 * concrete ship decorater
 * @author dkoehler
 */
public class RocketDecorater extends AbstractShipDecorator
{
 
	public function RocketDecorater(ship : AbstractSpaceShip)
	{
		super(ship);
		_firePower = 50;
		_description = "rocket";
	}
 
	override public function get description() : String
	{
		return spaceShip.description + " + " +_description;
	}
 
	override public function get firePower() : uint
	{
		return spaceShip.firePower + _firePower;
	}
}
}

Hier nun der finale Einsatz des Dekorieres. Im ersten Schritt wird ein neues Raumschiff erstellt. In den folgenden Schritten wird das Raumschiff mit einem Laser sowie mit Raketen “dekoriert”.

Dekorierer Client

package de.dirkkoehler.decoraterPattern
{
import de.dirkkoehler.decoraterPattern.shipDecorater.RocketDecorater;
import de.dirkkoehler.decoraterPattern.shipDecorater.LaserDecorater;
import de.dirkkoehler.decoraterPattern.spaceShips.AbstractSpaceShip;
import de.dirkkoehler.decoraterPattern.spaceShips.FighterShip;
 
import flash.display.Sprite;
 
/**
 * @author dkoehler
 */
public class DecoratorTest extends Sprite
{
	public function DecoratorTest()
	{
		var ship1 : AbstractSpaceShip = new FighterShip();
		ship1 = new LaserDecorater(ship1);
		ship1 = new RocketDecorater(ship1);
		trace(ship1.description);
		trace("firepower: " + ship1.firePower);
		trace("cargospace: " + ship1.cargoSpace);
	}
}
}
Veröffentlicht unter Actionscript, Design Pattern | Verschlagwortet mit , , , , , | Hinterlasse einen Kommentar

Actionscript 3 Design Pattern – Singleton

Das Singleton (auch Einzelstück genannt) ist ein in der Softwareentwicklung eingesetztes Entwurfsmuster und gehört zur Kategorie der Erzeugungsmuster (engl. Creational Patterns). Es verhindert, dass von einer Klasse mehr als ein Objekt erzeugt werden kann. Dieses Einzelstück ist darüber hinaus üblicherweise global verfügbar. Das Muster ist eines der von der so genannten Viererbande (GoF) publizierten Muster. (Quelle: Wikipedia)

UML Diagramm eines Singleton-Entwurfmusters

UML Singleton

Um eine globale Verfügbarkeit zu gewährleisten, wird die Instanz des Singletons als statische Membervariable bereitgestellt. Bei dem ersten Aufruf des Getters, wird eine neue Instanz des Singletons erstellt.

Da es in Actionscript 3 keine privaten Konstruktoren gibt, wie z.B. in JAVA, muss ein kleiner Trick angewendet werden, um das Instanzieren dieses Singletons zu verhindern. Dies wird durch eine weitere Klassendefinition innerhalb der Singleton-Klassendatei realisiert, welche als Übergabeparameter des Konstruktors dient. Da die „PrivateClass“ nur innerhalb des Singletons bekannt ist, wird es nicht möglich sein dieses von Außerhalb zu instanzieren.

package com.dirkkoehler
{
 
/**
 * @author dkoehler
 */
public final class Singleton
{
	//instance of singleton
	private static var _instance : Singleton;
 
	/*
	 * Constructor,
	 * can only used from this singleton, because
	 * PrivateClass is not reachable from outside
	 *
	 * @param privateClass instance of PrivateClass
	 */
	public function Singleton(privateClass : PrivateClass)
	{
	}
 
	/*
	 * get function for instance
	 *
	 * @return instance of singleton
	 */
	static public function get instance() : Singleton
	{
		if (_instance == null)
		{
			var privateClass : PrivateClass = new PrivateClass();
			_instance = new Singleton(privateClass);
		}
		return _instance;
	}
}
}
 
/*
 * PrivateClass only reachable from singleton
 */
class PrivateClass
{
}
Veröffentlicht unter Actionscript, Design Pattern | Verschlagwortet mit , , , , , | Hinterlasse einen Kommentar