/*
迭代器带来的启示:
定义一个基本操作的接口类,所有被操作的元素必须要满足这个接口类。
实现某种功能的函数或者类,这个接口类的指针进行操作间。
这个用法其实以前就用过了,但是借此机会重温一下。
下面的代码只是个人用来演示一下基本的思路,在实际开发中,可以结合实际情况进行扩展。
我非常同意某篇文章中关于设计模式的三重境界:
1、对各种设计模式,一知半解,不太懂。
2、熟练掌握各种设计模式,非常清楚它们的用法。
3、忘记设计模式,根据实际情况,进行最好的设计,无形之中把几种设计模式变种混在一起用。
*/
#include <iostream>
#include <windows.h>
#include <conio.h>
class IItem
{
public:
virtual BOOL IsSmallerThan(IItem*)=0;
virtual void printf()=0;
};
class Person : public IItem
{
private:
int age;
char name[256];
public:
Person( int a, char* n )
{
age = a;
strcpy(name,n);
}
int GetAge(){return age;}
virtual BOOL IsSmallerThan(IItem* pItem)
{
Person* p = dynamic_cast<Person*>(pItem);
if ( p == NULL )
{
::printf("Error in dynamic_cast - Person : IsSmallerThan \r\n");
exit(0);
}
return (age < p->GetAge()) ? TRUE:FALSE;
}
virtual void printf()
{
::printf("name:%s,age:%d\r\n",name,age);
}
};
void SortPerson(IItem** item,int num)
{
int* sn = new int [num];
int j = 0;
int i = 0;
int temp = 0;
for( i = 0 ; i < num ; i++ )
{
sn[i] = i;
}
for( i = 1 ; i < num ; i++)
{
j = i;
while(j>0)
{
if( item[sn[j]]->IsSmallerThan(item[sn[j-1]]) == TRUE )
{
temp = sn[j-1];
sn[j-1] = sn[j];
sn[j] = temp;
j--;
}else
{
break;
}
}
}
for( i = 0 ; i < num ; i++ )
{
item[sn[i]]->printf();
}
delete [] sn;
sn = NULL;
}
int main()
{
Person a(23,"Bob");
Person b(35,"King");
Person c(69,"Wang");
Person d(3,"Liu");
Person e(19,"Henter");
IItem* set[5];
set[0] = &a;
set[1] = &b;
set[2] = &c;
set[3] = &d;
set[4] = &e;
SortPerson(set,5);
getch();
return 0;
}