gpt4 book ai didi

java - 寻找合适的设计模式

转载 作者:行者123 更新时间:2023-12-01 14:50:46 25 4
gpt4 key购买 nike

好吧,由于服务器端响应配置不佳,我无法找到一种有效的方法来编写代码。
由于我试图传达的示例相当复杂,因此我将尝试使用现实生活中的示例来提供帮助。

假设我负责一项体育奖励计划,并且我正在尝试创建一个“顶级运动员页面”。该页面将显示三个运动类别中的顶尖男女运动员;棒球、篮球和橄榄球。与此不同的是,可能有一名男性获胜者而没有女性获胜者,反之亦然,或者根本没有获胜者。最重要的是,女性只能是棒球运动员或篮球运动员,而男性可以是这三者中的任何一个,或者既是篮球运动员又是足球运动员。棒球不能与其他任何事物结合在一起。最后,如果同时存在男性和女性玩家,则必须先显示女性。所有三个类别都有不同的属性,例如橄榄球的属性为“tds = 43”,而棒球的属性为“本垒打 = 32”。

因此服务器响应会产生困惑:

<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>

(如果球员姓名既适合足球又适合篮球,并且是男性,则您将两者结合起来)正如您所看到的,响应正在发送回我必须过滤掉的不感兴趣的玩家(不要问为什么),并且当玩家进行多种运动时,它不会合并数据。因此,对于我的方法,我有一个 xml 处理程序工厂,它将 xml 发送到指定的“玩家”处理程序。看起来像:

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 响应将使这样的任务变得更加容易,但事实并非如此,我想找到一种更有效的方法来完成此任务。如果有人能帮助我找到一个好的设计模式来解决这个问题,或者提供任何建议,我将非常感激。(此外,这些类别有更多的属性,而不仅仅是“本垒打、得分或达阵”,只是试图简化。)

最佳答案

不知道这里是否有特定的设计模式可以解决您的问题;从我的角度来看,您的模型缺少一些抽象,因为您主要使用字符串来表示您的域模型。这与 OOP 背道而驰,OOP 的思想是用对象来表示事物,以便您可以将行为委托(delegate)给它们。作为一个例子,考虑这段代码:

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 节点的读取委托(delegate)给类本身(请耐心等待,我不是 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 接口(interface)将排序顺序委托(delegate)给玩家本身,并且该模型也更适合您尝试建模的现实,因为您有一个在不同运动项目上有不同表现的球员。

话虽如此,您可能会在 Creational design patterns 中找到一些灵感。 ,特别是在Builder , FactoryAbstract Factory .

HTH

关于java - 寻找合适的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14880848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com