适配器模式
C++
# include <iostream>
using namespace std;
class Player
{
protected :
string name;
public :
Player ( string name) : name ( name) { }
virtual void Attack ( ) = 0 ;
virtual void Defense ( ) = 0 ;
virtual ~ Player ( ) { }
} ;
class Forwards : public Player
{
public :
Forwards ( string name) : Player ( name) { }
virtual void Attack ( )
{
cout << "前锋 " << name << "进攻" << endl;
}
virtual void Defense ( )
{
cout << "前锋 " << name << "防守" << endl;
}
} ;
class Center : public Player
{
public :
Center ( string name) : Player ( name) { }
virtual void Attack ( )
{
cout << "中锋 " << name << "进攻" << endl;
}
virtual void Defense ( )
{
cout << "中锋 " << name << "防守" << endl;
}
} ;
class Guards : public Player
{
public :
Guards ( string name) : Player ( name) { }
virtual void Attack ( )
{
cout << "后卫 " << name << "进攻" << endl;
}
virtual void Defense ( )
{
cout << "后卫 " << name << "防守" << endl;
}
} ;
class ForeignCenter
{
public :
void SetName ( string name)
{
this -> name = name;
}
string GstName ( )
{
return name;
}
void ForeignAttack ( )
{
cout << "外籍中锋 " << name << " 进攻" << endl;
}
void ForeignDefense ( )
{
cout << "外籍中锋 " << name << " 防守" << endl;
}
private :
string name;
} ;
class Translator : public Player
{
public :
Translator ( string name) : Player ( name)
{
ym = new ForeignCenter;
ym-> SetName ( name) ;
}
~ Translator ( )
{
if ( ym != NULL )
delete ym;
}
void Attack ( )
{
ym-> ForeignAttack ( ) ;
}
void Defense ( )
{
ym-> ForeignDefense ( ) ;
}
private :
ForeignCenter * ym;
} ;
int main ( )
{
Player * b = new Forwards ( "巴蒂尔" ) ;
b-> Attack ( ) ;
Player * c = new Guards ( "麦克格雷迪" ) ;
c-> Attack ( ) ;
Player * ym = new Translator ( "姚明" ) ;
ym-> Attack ( ) ;
ym-> Defense ( ) ;
return 0 ;
}
C
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
typedef struct Player
{
char name[ 50 ] ;
void ( * attack) ( const char * ) ;
void ( * defense) ( const char * ) ;
} Player;
typedef struct Forwards
{
Player base;
} Forwards;
typedef struct Center
{
Player base;
} Center;
typedef struct Guards
{
Player base;
} Guards;
typedef struct ForeignCenter
{
char name[ 50 ] ;
} ForeignCenter;
typedef struct Translator
{
Player base;
ForeignCenter * foreignCenter;
} Translator;
void forwards_attack ( const char * name)
{
printf ( "前锋 %s 进攻\n" , name) ;
}
void forwards_defense ( const char * name)
{
printf ( "前锋 %s 防守\n" , name) ;
}
void center_attack ( const char * name)
{
printf ( "中锋 %s 进攻\n" , name) ;
}
void center_defense ( const char * name)
{
printf ( "中锋 %s 防守\n" , name) ;
}
void guards_attack ( const char * name)
{
printf ( "后卫 %s 进攻\n" , name) ;
}
void guards_defense ( const char * name)
{
printf ( "后卫 %s 防守\n" , name) ;
}
void foreign_center_attack ( ForeignCenter * fc)
{
printf ( "外籍中锋 %s 进攻\n" , fc-> name) ;
}
void foreign_center_defense ( ForeignCenter * fc)
{
printf ( "外籍中锋 %s 防守\n" , fc-> name) ;
}
Player * create_forwards ( const char * name)
{
Player * p = ( Player * ) malloc ( sizeof ( Player) ) ;
strcpy ( p-> name, name) ;
p-> attack = forwards_attack;
p-> defense = forwards_defense;
return p;
}
Player * create_center ( const char * name)
{
Player * p = ( Player * ) malloc ( sizeof ( Player) ) ;
strcpy ( p-> name, name) ;
p-> attack = center_attack;
p-> defense = center_defense;
return p;
}
Player * create_guards ( const char * name)
{
Player * p = ( Player * ) malloc ( sizeof ( Player) ) ;
strcpy ( p-> name, name) ;
p-> attack = guards_attack;
p-> defense = guards_defense;
return p;
}
Translator * create_translator ( const char * name)
{
Translator * t = ( Translator * ) malloc ( sizeof ( Translator) ) ;
strcpy ( t-> base. name, name) ;
t-> foreignCenter = ( ForeignCenter * ) malloc ( sizeof ( ForeignCenter) ) ;
strcpy ( t-> foreignCenter-> name, name) ;
t-> base. attack = ( void ( * ) ( const char * ) ) foreign_center_attack;
t-> base. defense = ( void ( * ) ( const char * ) ) foreign_center_defense;
return t;
}
void player_free ( Player * p)
{
free ( p) ;
}
void translator_free ( Translator * t)
{
if ( t-> foreignCenter)
free ( t-> foreignCenter) ;
free ( t) ;
}
int main ( )
{
Player * b = create_forwards ( "巴蒂尔" ) ;
b-> attack ( b-> name) ;
Player * c = create_guards ( "麦克格雷迪" ) ;
c-> attack ( c-> name) ;
Translator * ym = create_translator ( "姚明" ) ;
ym-> base. attack ( ym-> base. name) ;
ym-> base. defense ( ym-> base. name) ;
player_free ( b) ;
player_free ( c) ;
translator_free ( ym) ;
return 0 ;
}