适配器模式
意图:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
使用场景
有动机地修改一个正常运行的系统的接口。
1、系统需要使用现有的类,而此类的接口不符合系统的需要。
2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
3、通过接口转换,将一个类插入另一个类系中。
优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。
缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
class Player{
public:
Player(string name):name(name){}
string GetName(){return name;}
virtual void Attack()=0;
virtual void Defense()=0;
private:
string name;
};
class Forwards:public Player{
public:
Forwards(string name):Player(name){}
void Attack(){
cout<<"Forwards "<<Player::GetName()<<" Attack"<<endl;
}
void Defense(){
cout<<"Forwards "<<Player::GetName()<<" Defense"<<endl;
}
};
class ForeignForwards{
public:
ForeignForwards(string name):name(name){}
void Attack(){
cout<<"ForeignForwards "<<name<<" Attack"<<endl;
}
void Defense(){
cout<<"ForeignForwards "<<name<<" Defense"<<endl;
}
private:
string name;
};
class Translator:public Forwards{
public:
Translator(string name):Forwards(name),foreignForward(name){
}
void Attack(){
foreignForward.Attack();
}
void Defense(){
foreignForward.Defense();
}
private:
ForeignForwards foreignForward;
};
int main_3(){
string name="transtor";
Player *p=new Translator(name);
p->Attack();
p->Defense();
}