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