//
Purpose.  Template Method design pattern
lab
// 
// Problem.  2
different spell-checking objects have a lot of common
//
functionality.  This means there is:
lots of duplicate code, no reuse,
// and a maintenance nightmare if
changes common to both classes become
// necessary.
// 
//
Assignment.
// o Create a common base class SpellChecker
// o
Subclass SimpleSpellChecker and SophisticatedSpellChecker off of it
// o
Move all common functionality to the base class
// o Wherever differences
exist (i.e. bubbleSortTheInput(),
//  
diffWithUnixDictionary(), proposeCorrectSpellings()), specify
//   "placeholders" in base
class
// o Implement differences in concrete derived classes
//
// Hints.
// o "Placeholders" could be pure virtual member
functions
// o "Placeholders" could be virtual member functions
that are overridden
//   in the
derived class, but "called back to" in the derived
//   implementation
// o If you have:
//     SimpleSomething::doItSimple() { cout
<< "doItSimple"; }
//    
HardSomething::doItHard()     {
cout << "doItHard"; }
// Consider creating something of
the form:
//     Something::doIt()
= 0;
//     SimpleSomething::doIt()
{ cout << "doItSimple"; }
//     HardSomething::doIt()  
{ cout << "doItHard"; }
#include
<iostream.h>
class SimpleSpellChecker {
public:
   void doIt() {
      removeControlCodes();
      convertToLowerCase();
      tokenizeInput();
      bubbleSortTheInput();
      collapseDuplicateEntries();
      diffWithUnixDictionary();
      proposeCorrectSpellings();
   }
private:
   void removeControlCodes() {
      cout <<
"removeControlCodes:" << endl; }
   void convertToLowerCase() {
      cout <<
"convertToLowerCase:" << endl; }
   void tokenizeInput() {
      cout << "tokenizeInput:"
<< endl; }
   void
bubbleSortTheInput() {
      cout
<< "bubbleSortTheInput:" << endl; }
   void collapseDuplicateEntries() {
      cout <<
"collapseDuplicateEntries:" << endl; }
   void diffWithUnixDictionary() {
      cout <<
"diffWithUnixDictionary:" << endl; }
   void proposeCorrectSpellings() {
      cout <<
"proposeCorrectSpellings:" << endl;
      cout << "   convert token to phonetic spelling"
<< endl;
      cout <<
"   generate all permutations"
<< endl;
      cout <<
"   use eenie-meenie to pick the
best choices" << endl;
  
}
};
class SophisticatedSpellChecker {
public:
   void doIt() {
     
removeControlCodes();
     
convertToLowerCase();
     
tokenizeInput();
     
mergeSortTheInput();
     
collapseDuplicateEntries();
     
diffWithOxfordDictionary();
     
proposeCorrectSpellings();
  
}
private:
   void
removeControlCodes() {
      cout
<< "removeControlCodes:" << endl; }
   void convertToLowerCase() {
      cout <<
"convertToLowerCase:" << endl; }
   void tokenizeInput() {
      cout << "tokenizeInput:"
<< endl; }
   void
mergeSortTheInput() {
      cout
<< "mergeSortTheInput:" << endl; }
   void collapseDuplicateEntries() {
      cout <<
"collapseDuplicateEntries:" << endl; }
   void diffWithOxfordDictionary() {
      cout <<
"diffWithOxfordDictionary:" << endl; }
   void proposeCorrectSpellings() {
      cout <<
"proposeCorrectSpellings:" << endl;
      cout << "   convert token to phonetic spelling"
<< endl;
      cout <<
"   generate all permutations"
<< endl;
      cout <<
"   rank order the
permutations" << endl;
     
cout << "   use AI to
pick the best choices" << endl;
   }
};
void main( void ) {
   SimpleSpellChecker         okay;
   SophisticatedSpellChecker 
good;
   cout <<
"********** Simple Spell Check **********" << endl;
   okay.doIt();
   cout << "********** Sophisticated
Spell Check **********" << endl;
   good.doIt();
}
// ********** Simple Spell Check
**********
// removeControlCodes:
// convertToLowerCase:
//
tokenizeInput:
// bubbleSortTheInput:
//
collapseDuplicateEntries:
// diffWithUnixDictionary:
//
proposeCorrectSpellings:
//   
convert token to phonetic spelling
//    generate all permutations
//    use eenie-meenie to pick the best choices
// **********
Sophisticated Spell Check **********
// removeControlCodes:
//
convertToLowerCase:
// tokenizeInput:
// mergeSortTheInput:
//
collapseDuplicateEntries:
// diffWithOxfordDictionary:
//
proposeCorrectSpellings:
//   
convert token to phonetic spelling
//    generate all permutations
//    rank order the permutations
//    use AI to pick the best choices