Skip to content

Instantly share code, notes, and snippets.

@mgarg1
Last active March 2, 2017 18:47
Show Gist options
  • Save mgarg1/8ad4fc44375b9f40a23924276416e1a9 to your computer and use it in GitHub Desktop.
Save mgarg1/8ad4fc44375b9f40a23924276416e1a9 to your computer and use it in GitHub Desktop.
Facade Design Pattern
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
//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;
};
#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