2013-02-14 86 views
0

好吧,由於服務器端響應配置不佳,我無法找到有效的方式來編寫我的代碼。
由於我想傳達的例子相當複雜,我會嘗試使用真實生活中的示例來提供幫助。尋找適當的設計模式

因此,我們可以說我負責一項體育獎勵計劃,並且試圖創建一個「頂級運動員網頁」。該頁面將顯示來自三種運動類別的頂級男性和女性運動員;棒球,籃球和足球。扭曲的是,可能會有一個男性冠軍,沒有女性冠軍,反之亦然,或者根本沒有贏家。最重要的是,女性只能是棒球運動員或籃球運動員,而男性既可以是籃球運動員,也可以是足球運動員。沒有棒球與其他任何東西的組合。最後,如果男性和女性都存在,女性必須首先展示。與棒球「Homeruns = 32」相比,所有三個類別都具有不同的屬性,例如足球將具有「tds = 43」屬性。

所以混亂進場服務器響應:

<player> 
    <baseballList> 
    <baseball 
    name="Adam" 
    sex="male" 
    HomeRuns="32" 
    reward="True"/> 
</baseballList> 
<basketballList> 
<basketball 
    name="John" 
    sex="male" 
    Points="322" 
    reward="False"/> 
    <basketball 
    name="Sandra" 
    sex="female" 
    Points="332" 
    reward="True"/> 
    </basketballList> 
    <footballList> 
    <football 
    name= doug 
    Touchdowns= 33 
    sex=male 
    reward="false"/> 
    </footballList> 
</player> 

(如果玩家名足球和籃球比賽,是男是當你將結合2)正如你所看到的響應 正在發回不需要的球員(不問爲什麼),我不得不過濾掉這些球員,以及當球員有多項運動時不會合並數據。 所以對於我的方法,我有一個xml處理程序工廠,它將xml發送到指定的「Players」處理程序。這看起來是這樣的:

public class PlayerHandler implements XmlHandler { 

private static PlayerHandler handler = new PlayerHandler(); 

private PlayerHandler() { 

} 

public static PlayerHandler getInstance() { 
    return handler; 
} 

public void load(String localName, String qName, Attributes attributes) { 
    if (localName != null && attributes != null) { 
     if  (localName.equalsIgnoreCase("football")||localName.equalsIgnoreCase("baseball")||localName.equalsIgnoreCase("basketball")) { 
Player player = new Player(); 

if (localName.equalsIgnoreCase("football")) 
player.category = "football" 
player.TouchDowns=attributes.getValue("TouchDowns"); 

else if (localName.equalsIgnoreCase("baseball")) 
    player.HomeRuns=arrtibutes.getValue("HomeRun"); 
    player.category = "baseball" 

else{ 
    player.category = "basketball"; 
    player.Points=attributes.getValue("Points");} 

    player.sex=attributes.getValue("sex"); 
    player.name=attributes.getValue("name"); 
} 
playerSorter.addPlayer(player);}} 

我創建的對象的一個​​類文件:

public class Player implements Serializable{ 
    public String category; 
    public String rewards; 
    public String TouchDowns; 
    public String Points; 
    public String HomeRuns; 
    public String sex; 
    public String Name; 
} 

我做所有我與一個名爲「playerSorter」與addPlayer()方法類排序的那僅填充列表,如果指定的條件得到滿足,那麼我有一個getPlayers()方法調用我的checkForAthleteWithInTwoSports()方法(經過,並認爲如果那裏有兩個籃球和足球運動員多數民衆贊成)不是返回排序列表的女人首先顯示(如果適用)。 getPlayers()方法從我的主頁面調用,然後將其設置爲適配器類。 更好的xml響應會讓這樣的任務更容易,但事實並非如此,我想找到一種更有效的方法來實現這一點。如果有人可以幫助我找到一個很好的設計圖案或任何意見,我會很感激它來解決這一點。(另外,類別已經不僅僅是「本壘打,點,漲幅達陣」只是想簡化多個屬性。)

回答

1

我不知道這裏是否有特定的設計模式來解決您的問題;從我的角度來看,您的模型缺少一些抽象,因爲您大多使用字符串來表示您的域模型。這種做法違背了面向對象的思想,即用對象表示事物,以便將行爲委託給他們。作爲一個例子考慮這一段代碼:

if (localName.equalsIgnoreCase("football")) 
player.category = "football" 
player.TouchDowns=attributes.getValue("TouchDowns"); 

else if (localName.equalsIgnoreCase("baseball")) 
    player.HomeRuns=arrtibutes.getValue("HomeRun"); 
    player.category = "baseball" 

else{ 
    player.category = "basketball"; 
    player.Points=attributes.getValue("Points");} 

這可以通過創建三個類來表示每個運動表現(FootballPerformanceBaseballPerformanceBasketballPerformance),其中,每個類包含適用於它們的屬性來容易地改善。一旦你有,你可以委託XML節點類本身的讀數(請原諒在這裏,我不是一個Java程序員,所以我將使用僞代碼):

public class BasketballPerformance extends SportPerformance { 
    private Integer points; 

    //Constructor 
    public BasketballPerformance(Attributes attributes) 
    { 
    this.points = attributes.getValue("Points"); 
    } 

    public getPoints() 
    { 
    return this.points; 
    } 
} 

的類FootballPerformanceBaseballPerformance非常相似,它們取一組屬性並根據它們自己填充。通過應用同樣的想法到Player類也可以分散對象創建成類似:

public Sport createSportPerformanceInstance(String name, Attributes attributes) 
{ 
if (name.equalsIgnoreCase("football")) 
    {return new BasketballPerformance(attributes);} 
else 
if (name.equalsIgnoreCase("baseball")) 
    {return new BaseballPerformance(attributes);} 
... 
} 


public void load(String localName, String qName, Attributes attributes) 
{ 
SportPerformance sportPerformance = this.createSportPerformanceInstance(localName, attributes); 
Player player = new Player(Attributes attributes); 
player.sportPerformance = sportPerformance; 
} 

注意,作爲一個很好的副作用,如果以後添加一個新的運動,你只需要實現新的類,並在createSportPerformanceInstance方法中添加新分支,而不是潛入單個大型方法中。

稍後可以通過讓Player擁有一系列表演而不僅僅是一個表演,並讓PlayerHandler在創建新表演之前檢查球員是否存在來稍後改進該代碼。這種新方法會是這個樣子:

public void load(String localName, String qName, Attributes attributes) 
{ 
SportPerformance sportPerformance = this.createSportPerformanceInstance(localName, attributes); 
String playerName=attributes.getValue("name"); 
Player player; 
    if (!this.playerExists(playerName)) 
    { 
    player = new Player(attributes); 
    } else 
    { 
     player = this.getPlayerByName(playerName); 
    } 
    player.addPerformance(sportPerformance); 
} 

的好處是,現在你可以通過實現Comparable接口委託排序次序給玩家自身和模式也比較適合你,你正試圖將現實模型,因爲你有一個球員在不同的運動上有不同的表現。

話雖如此,你可能在Creational design patterns,特別是在Builder,FactoryAbstract Factory找到一些靈感。

HTH

+0

哇,喜歡它。有時候我最終偏離了更多的OOP類型=(。非常感謝你打入我的虛擬數據並花時間幫助我!對不起,我現在不能投票給你(沒有足夠的聲望) 。 – user1823974 2013-02-15 17:13:44

+0

@ user1823974:完全沒問題!很高興幫助:) – 2013-02-15 17:17:44