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我需要翻譯
注:以上文章僅是個人總結,若有不當之處,望不吝賜教