這兩星期里得看懂Robocode代碼,然后自己做個類似小霸王坦克大戰的游戲出來@@ 只能老老實實啃了
首先要了解了一些常用的設計模式,由于時間有限,就不去看四人幫的那本書了,偷懶google別人的文章快速入門算了
Robocode中有不少Manager類,其實就是Façade模式的應用。
http://www.fish888.com/Facade-t126336
1、官方描述:
為子系統中的一組接口提供一個一致的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
2、實例討論:
我們可以通過電視機遙控器的作用來理解該模式的價值和作用,電視機的內部很復雜,包括頻道調節和處理系統、圖像色彩調節處理系統、聲音調節系統等等,每個系統又包括多個類進行操作,如果把這些系統都暴露給用戶使用,而不是通過遙控器進行封裝,那么每個電視機用戶都可能需要進行一個《電視機操作使用》培訓才能使用了。相對而言,現在通過遙控器,電視機用戶在很短的時間就可以掌握常規的使用方法。
電視機遙控器及電視機內部的結構圖如下所示:
3、適用性:
1)為復雜的子系統提供一個簡單的接口,子系統可能為了通用性目標,實現為可以根據使用情況進行各種定制的復雜系統,可是按照2/8法則,80%的用戶可能只是使用簡單的20%的功能,這樣通過提供Facade對子系統進行高層概括,便極大的簡化了這80%用戶的易用性;
2)子系統存在多種實現,通過Facade在用戶和子系統內部實現之間進行分離,減弱了用戶對子系統的實現依賴性,這樣就便于對子系統進行擴展和維護;
3)降低子系統之間的依賴性;
4、實現特征:
1)Facade不提供新的功能,僅作為子系統的高層概括和代理;
2)子系統不知道Facade的存在,即子系統中沒有對Facade的關聯,而只是Facade了解子系統內部結構;
3)Facade原則上并不禁止用戶直接訪問子系統中的對象,Facade在子系統的可定制性上層建立了一個簡單視圖;
5、Java代碼演示:
下面代碼演示了電視機遙控器的程序結構:
1)子系統部分代碼:
類ChannelManager(頻道管理器),負責電視頻道的相關調整和操作:
package qinysong.pattern.facade.subsystem;
public class ChannelManager ...{
//當前頻道編號
private int currentChannelNumber;
//設置頻道(可能還會調用其它輔助類)
public void chooseChannel(int channelNumber) ...{
System.out.println("ChannelManager.chooseChannel(): 設置頻道(可能還會調用其它輔助類)");
currentChannelNumber = channelNumber;
}
//上調頻道(可能還會調用其它輔助類)
public void upSkipChannel()...{
System.out.println("ChannelManager.upSkipChannel(): 上調頻道(可能還會調用其它輔助類)");
currentChannelNumber++;
}
//下調頻道(可能還會調用其它輔助類)
public void downSkipChannel()...{
System.out.println("ChannelManager.downSkipChannel(): 下調頻道(可能還會調用其它輔助類)");
currentChannelNumber--;
}
public void otherMethod()...{
System.out.println("ChannelManager.otherMethod(): 其他方法");
}
}
類AudioManager(聲頻管理器),負責聲音的相關調整和操作,該類還用到其他類,如類Volume等:
package qinysong.pattern.facade.subsystem;
public class AudioManager ...{
//當前音量
private Volume currentVolume;
//加重音量
public void aggravateVolume()...{
System.out.println("AudioManager.aggravateVolume(): 加重音量(可能還會調用其它輔助類)");
currentVolume.aggravate();
}
//降低音量
public void weakenVolume()...{
System.out.println("AudioManager.weakenVolume(): 降低音量(可能還會調用其它輔助類)");
currentVolume.weaken();
}
public void otherMethod()...{
System.out.println("AudioManager.otherMethod(): 其他方法");
}
}
類ColorManager(色彩管理器),負責圖像色彩的相關調整和操作,該類還用到其他類,如類Color等:
package qinysong.pattern.facade.subsystem;
public class ColorManager ...{
//當前色彩度
private Color currentColor;
//加重色彩度
public void aggravateColor()...{
System.out.println("ColorManager.aggravateColor(): 加重色彩度(可能還會調用其它輔助類)");
currentColor.aggravate();
}
//降低色彩度
public void weakenColor()...{
System.out.println("ColorManager.weakenColor(): 降低色彩度(可能還會調用其它輔助類)");
currentColor.weaken();
}
public void otherMethod()...{
System.out.println("ColorManager.otherMethod(): 其他方法");
}
}
2)視圖代碼:
類RemoteDevice(遙控器),對電視機的日常使用操作進行封裝,以便用戶使用:
package qinysong.pattern.facade;
import qinysong.pattern.facade.subsystem.AudioManager;
import qinysong.pattern.facade.subsystem.ColorManager;
import qinysong.pattern.facade.subsystem.ChannelManager;
public class RemoteDevice ...{
private AudioManager audioManager;
private ColorManager colorManager;
private ChannelManager channelManager;
//加重音量
public void aggravateVolume()...{
//取得 audioManager
audioManager.aggravateVolume();
}
//降低音量
public void weakenVolume()...{
//取得 audioManager
audioManager.weakenVolume();
}
//加重色彩度
public void aggravateColor()...{
//取得 colorManager
colorManager.aggravateColor();
}
//降低色彩度
public void weakenColor()...{
//取得 colorManager
colorManager.weakenColor();
}
//設置頻道(可能還會調用其它輔助類)
public void chooseChannel(int channelNumber) ...{
//取得 channelManager
channelManager.chooseChannel(channelNumber);
}
//上調頻道(可能還會調用其它輔助類)
public void upSkipChannel()...{
//取得 channelManager
channelManager.upSkipChannel();
}
//下調頻道(可能還會調用其它輔助類)
public void downSkipChannel()...{
//取得 channelManager
channelManager.downSkipChannel();
}
}