Pattern | Intent |
---|---|
Adapter | Converts one interface to another so that it matches what the client is expecting |
Decorator | Dynamically adds responsibility to the interface by wrapping the original code |
Builder | Hides the process of construction by decomposing it in smaller steps. |
Factory | Hides the concrete implementation or instantiation of an object or object graph |
Facade | Provides a simplified interface |
Last active
March 2, 2017 18:47
-
-
Save mgarg1/8ad4fc44375b9f40a23924276416e1a9 to your computer and use it in GitHub Desktop.
Facade Design Pattern
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Facade | |
class Compiler { | |
public: | |
Compiler(); | |
virtual void Compile(istream & , BytecodeStream & ); | |
}; | |
void Compiler::Compile( | |
istream & input, BytecodeStream & output | |
) { | |
Scanner scanner(input); | |
ProgramNodeBuilder builder; | |
Parser parser; | |
parser.Parse(scanner, builder); | |
RISCCodeGenerator generator(output); | |
ProgramNode * parseTree = builder.GetRootNode(); | |
parseTree - > Traverse(generator); | |
} | |
//Visitor pattern subsystem | |
class CodeGenerator { | |
public: | |
virtual void Visit(StatementNode * ); | |
virtual void Visit(ExpressionNode * ); | |
// ... | |
protected: | |
CodeGenerator(BytecodeStream & ); | |
protected: | |
BytecodeStream & _output; | |
}; | |
//Composite pattern subsystem | |
class ProgramNode { | |
public: | |
// program node manipulation | |
virtual void GetSourcePosition(int & line, int & index); | |
// ... | |
// child manipulation | |
virtual void Add(ProgramNode * ); | |
virtual void Remove(ProgramNode * ); | |
// ... | |
virtual void Traverse(CodeGenerator & ); | |
protected: | |
ProgramNode(); | |
}; | |
class StatementNode:public ProgramNode{ | |
// ... | |
public: | |
virtual void Traverse(CodeGenerator & ); | |
}; | |
class StatementNode:public ProgramNode{ | |
// ... | |
public: | |
virtual void Traverse(CodeGenerator & ); | |
}; | |
void ExpressionNode::Traverse(CodeGenerator & cg) { | |
cg.Visit(this); | |
ListIterator i(_children); | |
for (i.First(); !i.IsDone(); i.Next()) { | |
i.CurrentItem() - > Traverse(cg); | |
} | |
} | |
class ProgramNodeBuilder { | |
public: | |
ProgramNodeBuilder(); | |
virtual ProgramNode * NewVariable( | |
const char * variableName | |
) const; | |
virtual ProgramNode * NewAssignment( | |
ProgramNode * variable, ProgramNode * expression | |
) const; | |
virtual ProgramNode * NewReturnStatement( | |
ProgramNode * value | |
) const; | |
virtual ProgramNode * NewCondition( | |
ProgramNode * condition, | |
ProgramNode * truePart, ProgramNode * falsePart | |
) const; | |
// ... | |
ProgramNode * GetRootNode(); | |
private: | |
ProgramNode * _node; | |
}; | |
class Parser { | |
public: | |
Parser(); | |
virtual~Parser(); | |
virtual void Parse(Scanner & , ProgramNodeBuilder & ); | |
}; | |
class Scanner { | |
public: | |
Scanner(istream & ); | |
virtual~Scanner(); | |
virtual Token & Scan(); | |
private: | |
istream & _inputStream; | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <string> | |
#include <iostream> | |
using namespace std; | |
namespace DesignPattern_Facade | |
{ | |
class SubsystemA | |
{ | |
public: | |
string OperationA1() | |
{ | |
return "Subsystem A, Method A1\n"; | |
} | |
string OperationA2() | |
{ | |
return "Subsystem A, Method A2\n"; | |
} | |
}; | |
class SubsystemB | |
{ | |
public: | |
string OperationB1() | |
{ | |
return "Subsystem B, Method B1\n"; | |
} | |
string OperationB2() | |
{ | |
return "Subsystem B, Method B2\n"; | |
} | |
}; | |
class SubsystemC | |
{ | |
public: | |
string OperationC1() | |
{ | |
return "Subsystem C, Method C1\n"; | |
} | |
string OperationC2() | |
{ | |
return "Subsystem C, Method C2\n"; | |
} | |
}; | |
class Facade | |
{ | |
private: | |
SubsystemA a; | |
SubsystemB b; | |
SubsystemC c; | |
Facade() | |
// :a(new SubsystemA()),b(new SubsystemB()),c(new SubsystemC()){ | |
{ | |
} | |
public: | |
void Operation1() | |
{ | |
cout << "Operation 1\n" | |
<< a.OperationA1() | |
<< b.OperationB1() | |
<<c.OperationC1(); | |
} | |
void Operation2() | |
{ | |
cout << "Operation 1\n" | |
<< a.OperationA2() | |
<< b.OperationB2() | |
<<c.OperationC2(); | |
} | |
}; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment