A privát adatosztály minta egy szerkezeti programtervezési minta. Célja, hogy a privát adatokat úgy elrejtse, hogy azokról senki más ne tudjon. Nevezik pimpl mintának vagy opaque (átlátszatlan) pointernek is.
A privát adatokat egyetlen adat objektumba csomagolja, ezzel csökkenti az attributumok számát. Az osztály készítője dönthet arról, hogy még az osztály metódusai se tudják írni azokat az adattagokat, amelyek konstansok, de ez nincs deklarálva, például azért, hogy a konstruktor többször is beállíthassa. Ez a minta egyik motivációja.
Egy másik motivációja az, hogy egy osztály (A) tudhat egy másik osztály (B) privát adattagjairól. Ez a tudása fölösleges, hiszen amúgy sem tudja közvetlenül elérni őket, viszont ezek változásakor nemcsak a B osztályt, hanem az A osztályt is újra kell fordítani. A minta alkalmazásával ez a tudás és függés a privát adattagoktól nem létezik, a privát adattagok változásával a program binárisan kompatibilis marad az előző verzióval.
Résztvevők: a burkoló osztály és az adatosztály. Az adatosztály nem érhető el közvetlenül kívülről, hanem csak a burkoló osztály publikus függvényeivel. A burkoló osztály adatlekérői és beállítói delegálják a kérést az adat osztálynak. Maga a burkoló osztály az adat osztály getter és szetter függvényein keresztül érheti el a privát adattagjait. Egyes változatokban az adatosztály függvényeket is tartalmaz, amiket a burkoló osztály meghívhat, de mások nem.
A minta használatának következményei: Új konstans típus: konstruktor után konstans. Erősebb ellenőrzés az osztály privát adattagjaihoz való hozzáférést tekintve. Adatok és metódusok elkülönítése. Adat inicializáció egységbe zárása. Példa A következő C# példa a minta alkalmazására: public class Circle { private double radius; private Color color; private Point origin; public Circle(double radius, Color color, Point origin)
this.radius = radius; this.color = color; this.origin = origin;
public double Circumference
get { return 2 * Math.PI * this.radius; }
public double Diameter
get { return 2 * this.radius; }
public void Draw(Graphics graphics)
//...
A példában szereplő radius, color, és origin nem változhatnak a Circle() konstruktor hívása után. Láthatóságukat a private módosító korlátozza, de a Circle osztály metódusai még mindig hozzáférhetnek.
Az attribnutumok fölösleges láthatósága fölösleges kapcsolatot hoz létre metódusok között. A minta lehetővé teszi a láthatóság további csökkentését és a kapcsolatok gyengítését:
public class CircleData { private double radius; private Color color; private Point origin; public CircleData(double radius, Color color, Point origin)
this.radius = radius; this.color = color; this.origin = origin;
public double Radius
get { return this.radius; }
public Color Color
get { return this.color; }
public Point Origin
get { return this.origin; }
public class Circle { private CircleData circleData; public Circle(double radius, Color color, Point origin)
this.circleData = new CircleData(radius, color, origin);
public double Circumference
get { return 2 * this.circleData.Radius * Math.PI; }
public double Diameter
get { return this.circleData.Radius * 2; }
public void Draw(Graphics graphics)
//...
Most a Circle osztály CircleData típusú adattagja foglalja magában azokat az adattagokat, amiket korábban a Circle metódusai kezeltek. A mostani elrendezésben csak a konstruktor tudja őket beállítani, a metódusok nem. Ismert példák A Qt keretrendszer használja a mintát megosztott könyvtáraiban. A beágyazó osztálynak van d-pointere az adatosztályra.
Jegyzetek
Források Sourcemaking.com Fordítás
Kategória:Programtervezési minták