//
Purpose. Facade #include
<iostream.h>
// #include
<string.h>
// Discussion.
Class Compute models #define
sl strlen
// a decimal digit adder module. An
// entire "subsystem" can be configur- class Compute {
// ed by linking as
many of these public:
//
modules as the desired precision
char add( char a, char b, int& c ) {
// requires. The "subsystem" being int result = a + b + c - 96;
//
modeled in main() is complex and c = 0;
// burdensome to use. Wrapping this if (result > 9) {
// subsystem inside of a Facade
that result -= 10;
//
exports a simple interface is
c = 1;
// desirable. }
return result +
48;
#include <iostream.h> }
#include <string.h> };
#define sl
strlen
class Facade {
class
Compute { public:
public: char* add(
char* a, char* b ) {
char add(
char a, char b, int& c) { int
cary = 0, i = 0;
int result =
a + b + c - 96; char c, d;
c = 0; if ((sl(a) > 1) && (sl(b)
> 1)) {
if (result > 9)
{ c = ones.add(
a[1], b[1], cary );
result
-= 10; d =
tens.add( a[0], b[0], cary );
c = 1;
} else if (sl(a) > 1) {
}
c = ones.add( a[1], b[0], cary );
return result + 48; d = tens.add( a[0], '0', cary );
}
} else if (sl(b) > 1) {
}; c = ones.add( b[1],
a[0], cary );
d = tens.add(
b[0], '0', cary );
void main( void
) { } else
{
Compute tens, ones; c = tens.add( a[0], b[0], cary );
char
a[9], b[9], c, d;
d = 'x';
int cary; }
while (1) { if (cary)
ans[i++] = '1';
cout <<
"Enter 2 nums: ";
if (d != 'x') ans[i++] =
d;
cin >> a
>> b;
ans[i++] = c;
cout
<< " sum is "; ans[i] = '\0';
cary = 0; return ans;
if ((sl(a) > 1) && (sl(b) >
1)) { }
c = ones.add( a[1], b[1], cary); private:
d = tens.add( a[0], b[0], cary); Compute tens,
ones;
} else if (sl(a) > 1)
{ char ans[9];
c = ones.add( a[1], b[0], cary); };
d =
tens.add( a[0], '0', cary);
} else if (sl(b) > 1) { void main( void ) {
c = ones.add( b[1], a[0], cary); Facade
f;
d = tens.add(
b[0], '0', cary); char
a[9], b[9];
} else { while (1)
{
c = tens.add( a[0], b[0],
cary); cout << "Enter
2 nums: ";
d = 'x'; cin >> a
>> b;
} cout
<<" sum is "<<
f.add(a,b)
if (cary) cout
<< '1';
<< endl;
if (d !=
'x') cout << d; } }
cout << c << endl;
}
}
// Enter 2 nums: 9 13
// sum is 22
// Enter 2 nums: 99 99 // Enter 2 nums: 19 8
// sum is 198 //
sum is 27
// Enter 2 nums: 38 83 // Enter 2 nums: 3 99
// sum is 121 //
sum is 102
// Enter 2 nums: 5 6
// sum is 11
// Purpose. Facade design pattern demo.
//
//
Discussion. Structuring a system into
subsystems helps reduce
// complexity.
A common design goal is to minimize the communication and
//
dependencies between subsystems. One
way to achieve this goal is to
// introduce a "facade" object
that provides a single, simplified
// interface to the many, potentially
complex, individual interfaces
// within the subsystem. In this example, the "subsystem"
for responding
// to a networking service request has been modeled, and a
facade
// (FacilitiesFacade) interposed.
The facade "hides" the twisted and
// bizarre
choreography necessary to satisfy even the most basic of
// requests. All the user of the facade object has to do
is make one or
// two phone calls a week for 5 months, and a completed
service request
// results.
#include <iostream.h>
class
MisDepartment {
public:
void
submitNetworkRequest() { _state = 0; }
bool
checkOnStatus() {
_state++;
if (_state == Complete)
return 1;
return 0; }
private:
enum States {Received, DenyAllKnowledge,
ReferClientToFacilities,
FacilitiesHasNotSentPaperwork,
ElectricianIsNotDone,
ElectricianDidItWrong,
DispatchTechnician, SignedOff, DoesNotWork,
FixElectriciansWiring, Complete};
int _state;
};
class
ElectricianUnion {
public:
void
submitNetworkRequest() { _state = 0; }
bool
checkOnStatus() {
_state++;
if (_state == Complete)
return 1;
return 0; }
private:
enum States {Received, RejectTheForm,
SizeTheJob, SmokeAndJokeBreak,
WaitForAuthorization,
DoTheWrongJob, BlameTheEngineer, WaitToPunchOut,
DoHalfAJob, ComplainToEngineer, GetClarification,
CompleteTheJob,
TurnInThePaperwork,
Complete};
int _state;
};
class
FacilitiesDepartment {
public:
void
submitNetworkRequest() { _state = 0; }
bool
checkOnStatus() {
_state++;
if (_state == Complete)
return 1;
return 0; }
private:
enum States {Received, AssignToEngineer,
EngineerResearches,
RequestIsNotPossible,
EngineerLeavesCompany, AssignToNewEngineer,
NewEngineerResearches, ReassignEngineer,
EngineerReturns,
EngineerResearchesAgain,
EngineerFillsOutPaperWork, Complete};
int
_state;
};
class FacilitiesFacade {
public:
FacilitiesFacade() { _count = 0; }
void submitNetworkRequest() { _state = 0;
}
bool checkOnStatus() {
_count++;
/* Job request has just been
received */
if (_state ==
Received) {
_state++;
/* Forward the job request to
the engineer */
_engineer.submitNetworkRequest();
cout << "submitted
to Facilities - " << _count
<<
" phone calls so far" << endl; }
else if (_state == SubmitToEngineer) {
/* If engineer is complete,
forward to electrician */
if
(_engineer.checkOnStatus()) {
_state++;
_electrician.submitNetworkRequest();
cout <<
"submitted to Electrician - " << _count
<< "
phone calls so far" << endl; } }
else if (_state == SubmitToElectrician) {
/* If electrician is complete,
forward to technician */
if
(_electrician.checkOnStatus()) {
_state++;
_technician.submitNetworkRequest();
cout <<
"submitted to MIS - " << _count
<< " phone calls so
far" << endl; } }
else
if (_state == SubmitToTechnician) {
/*
If technician is complete, job is done */
if
(_technician.checkOnStatus())
return
1; }
/* The job is not
entirely complete */
return
0; }
int getNumberOfCalls() {
return _count; }
private:
enum
States {Received, SubmitToEngineer, SubmitToElectrician,
SubmitToTechnician};
int _state;
int _count;
FacilitiesDepartment _engineer;
ElectricianUnion
_electrician;
MisDepartment _technician;
};
void
main() {
FacilitiesFacade facilities;
facilities.submitNetworkRequest();
/* Keep checking until job is complete
*/
while ( !
facilities.checkOnStatus())
;
cout << "job completed after
only " << facilities.getNumberOfCalls()
<< " phone calls" << endl;
}
//
submitted to Facilities - 1 phone calls so far
// submitted to Electrician
- 12 phone calls so far
// submitted to MIS - 25 phone calls so far
//
job completed after only 35 phone calls