Adapter:适配器模式
先代码
package h.l.demo.adapter;
/**
*
* @author: Is-Me-Hl
* @date: 2020年3月1日
* @Description: 适配器模式Demo
*/
public class Adapter {
public static void main(String[] args) {
// 前锋
Player fp = new Forwards("巴蒂尔");
fp.attack();
fp.defense();
// 后卫
Player gp = new Guards("麦克格雷迪");
gp.attack();
gp.defense();
// 中锋:听到英文版的
/*Player cp = new Center("姚明");
cp.attack();
cp.defense();*/
Player cp = new LanguageTranslator("姚明");
cp.attack();
cp.defense();
}
}
/**
*
* @author: Is-Me-Hl
* @date: 2020年3月1日
* @Description: 运动员抽象类
*/
abstract class Player {
// 运动员姓名
protected String name;
public Player(String name) {
this.name = name;
}
// 进攻
public abstract void attack();
// 防御
public abstract void defense();
}
/**
*
* @author: Is-Me-Hl
* @date: 2020年3月1日
* @Description: 前锋运动员
*/
class Forwards extends Player {
public Forwards(String name) {
super(name);
}
@Override
public void attack() {
System.out.println("前锋【" + super.name + "】进攻");
}
@Override
public void defense() {
System.out.println("前锋【" + super.name + "】防御");
}
}
/**
*
* @author: Is-Me-Hl
* @date: 2020年3月1日
* @Description: 中锋运动员
*/
class Center extends Player {
public Center(String name) {
super(name);
}
@Override
public void attack() {
System.out.println("中锋【" + super.name + "】进攻");
}
@Override
public void defense() {
System.out.println("中锋【" + super.name + "】防御");
}
}
/**
*
* @author: Is-Me-Hl
* @date: 2020年3月1日
* @Description: 后卫运动员
*/
class Guards extends Player {
public Guards(String name) {
super(name);
}
@Override
public void attack() {
System.out.println("后卫【" + super.name + "】进攻");
}
@Override
public void defense() {
System.out.println("后卫【" + super.name + "】防御");
}
}
/**
*
* @author: Is-Me-Hl
* @date: 2020年3月1日
* @Description: 外籍中锋
*/
class ForeignCenter{
public void 进攻(String name) {
System.out.println("外籍中锋【" + name + "】进攻");
}
public void 防御(String name) {
System.out.println("外籍中锋【" + name + "】防御");
}
}
/**
*
* @author: Is-Me-Hl
* @date: 2020年3月1日
* @Description: 翻译:适配类
*/
class LanguageTranslator extends Player {
private ForeignCenter fc = new ForeignCenter();
public LanguageTranslator(String name) {
super(name);
}
@Override
public void attack() {
fc.进攻(super.name);
}
@Override
public void defense() {
fc.防御(super.name);
}
}
测试结果:
后分析
- 个人建议:写代码是件幸福的事,So,do it
适配器模式,定义是:讲一个类的接口转换成客户希望的另外一个接口。目的是使原来由于接口不兼容而不能一起工作的那些类可以一起工作。对比上面的demo,可以看出,通过增加一个适配类即可完成不同接口之间的转化。在软件开发中,当数据和行为都正确,但接口不符合时,我们应该考虑使用适配器,目的是使控制之外的一个缘由对象与某一个接口匹配,适配器主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
当然,适配器模式虽然不错,但也不能滥用,能事先预防接口不同的额问题,不匹配问题就不会发生,在有小的接口不统一问题发生时,及时重构,问题不至于扩大,只有碰到无法改变原有设计和代码的情况时,才考虑适配。事后控制不如事中控制,事中控制不如事前控制。
其他例子:参考自《大话设计模式》在NBA我需要翻译
注:以上文章仅是个人总结,若有不当之处,望不吝赐教