Вы находитесь на странице: 1из 36

12

20.05.2013 .

ADAPTER

Adapter


, .

Wrapper ().

class Circle {
public:
! virtual void draw();
! virtual double area();
! // ....
};
void reallyCoolThing(Circle *);
void amazingStuff(Circle *);

class Circle {
public:
! virtual void draw();
! virtual double area();
! // ....
};
void reallyCoolThing(Circle *);
void amazingStuff(Circle *);

class OldAndRustyCircle {
! void draw_me();
! void get_area_and_circumference(double *result,
double *circum);
};

class Circle {
public:
! virtual void draw();
! virtual double area();
! // ....
};
void reallyCoolThing(Circle *);
void amazingStuff(Circle *);

class OldAndRustyCircle {
! void draw_me();
! void get_area_and_circumference(double *result,
double *circum);
};

class NewAndShinyCircle : public Circle {


public:
! void draw() { old_circle.draw_me(); }
! // ....
private:
! OldAndRustyCircle old_circle;
};

: (
).

: (
).

: :
class NewAndShinyCircle : public Circle, OldAndRustyCircle.

: (
).

: :
class NewAndShinyCircle : public Circle, OldAndRustyCircle.

BRIDGE


, ,
.

class Window {
public:
! void drawText();
! void drawRect();
};
class DialogWindow : public Window {
! // ...
};
class TransientWindow : public Window {
! // ...
};
// OSXWindow, Win32Window, X11Window, ...

class WindowImp {
public:
! virtual void _drawText();
! virtual void _drawLine();
};
class X11WindowImp: public WindowImp {
public:
! void _drawText() {
XDrawString(/*...*/); }
! void _drawLine() {
XDrawLine(/*...*/); }
};
class Window {
private:
! WindowImp *imp;
! // .....
};


Window

imp

DialogWindow
TransientWindow

WindowImp

X11WindowImp
OSXWindowImp


().


().


().


().


().


( ).

COMPOSITE


-.

, .

class GraphicsObject {
public:
! virtual void draw();
};
class Rectangle : public GraphicsObject {
! // ...
};
class Ellipse : public GraphicsObject {
! // ...
};
class CompositeObject : public GraphicsObject {
! std::vector<GraphicsObject *> objects;
public:
! void add(GraphicsObject *obj);
!
!

void draw() {
! std::vector<GraphicsObject *>::iterator q;

!
!
!

!
!
}

for (q = objects.begin(); q != objects.end(); ++q)


! q->draw();

! // ....
};


(GraphicsObject ).

DECORATOR

class VisualComponent {
public:
! virtual void draw();
};
class TextView : public VisualComponent {
! // ....
};

class Decorator : public VisualComponent {


public:
! void draw() { component->draw(); }
private:
! VisualComponent *component;
};
class BorderDecorator : public Decorator {
public:
! void draw() {
! ! component->draw();
! ! drawBorder();
! }
private:
! int borderWidth;
! void drawBorder();
};
class ScrollDecorator : public Decorator {
public:
! void draw();
! void scrollTo();
private:
! int scrollPosition;
};

, (
).

, (
).

!= .

, (
).

!= .

== .

, (
).

!= .

== .

, (
).

!= .

== .

(VisualComponent) .

, (
).

!= .

== .

(VisualComponent) .

, ,
.

FACADE

(
)
.

class Scanner {
public:
! Scanner(istream &);
! virtual ~Scanner();

class ProgramNode {
public:
! virtual void getSourcePosition(int &line, int &col);
! virtual void traverse(CodeGenerator &);

! virtual Token &scan();


! // ....
};

! // ....
};

class Parser {
public:
! Parser();
! virtual ~Parser();

class CodeGenerator {
public:
! virtual void visit(StatementNode *);
! virtual void visit(ExpressionNode *);

! void CodeGenerator(BytecodeStream &);


};

virtual void parse(Scanner &,


ProgramNodeBuilder&);

};
class ProgramNodeBuilder {
public:
! ProgramNodeBuilder();
!
!
!
!

virtual
virtual
virtual
virtual

ProgramNode *rootNode();

! // ....
};

void
void
void
void

ProgramNode
ProgramNode
ProgramNode
ProgramNode

*newVariable(const char *name) const;


*newAssignment(ProgramNode *var, ProgramNode *expr) const;
*newReturnStatement(ProgramNode *value) const;
*newCondition(ProgramNode *cond, ProgramNode *truePart,
ProgramNode *falePart) const;


class Compiler {
public:
! Compiler();
!
!
!
!

virtual void compile(istream &input, BytecodeStream &output) {


! Scanner scanner(input);
! ProgramNodeBuilder builder;
! Parser parser;

parser.parse(scanner, builder);

!
!
!
!
};

!
!
!
}

IntelCodeGenerator generator(output);
ProgramNode *parseTree = builder.rootNode();
parseTree->traverse(generator);

FLYWEIGHT

class Validator {
public:
! virtual bool validateString(std::string const &str);
};
class IntValidator {
public:
! IntValidator(int min = INT_MIN, int max = INT_MAX);
! virtual bool validateString(std::string const &str);
};
class DoubleValidator {
public:
! DoubleValidator(double min = -DBL_MAX, double max = DBL_MAX);
! virtual bool validateString(std::string const &str);
};

class ValidatorPool {
public:
! Validator *getValidator(const char *name,
const std::string &param1,
const std::string &param2);
};

, :
, .
.

PROXY

class Graphic {
public:
! virtual void draw();
! Rect getExtent() const;
! // .....
};
class Image : public Graphic {
! // ....
};
class ImageProxy : public Graphic {
! std::string fileName;
! Rect extent;
public:
! void draw() {
! ! if (!image)
! ! ! image = loadImage(fileName);
! ! image->draw();
! }
!
!
!
!
!

Rect getExtent() const {


! if (image)
! ! return image->getExtent();
! else
! ! return extent;

! }
};

Вам также может понравиться