根据某些条件(而不是用不同的顺序重新编写它们)来操纵顺序的最好方法是什么?
假设有一个Person类,Person的每个对象代表一个不同的人。
class Person{
int eatingPriority = 3;
int sleepingPriority = 2;
int recreationPriority = 1;
void eat() {/*eats*/}
void sleep() {/*sleeps*/}
void watchTv() {/*watches tv*/}
void satisfyNeeds() {
//HOW TO DO THIS
}
}
如何让satisfyNeeds()
方法根据优先级调用其他三个方法?
注意:我想说明的是,优先级可以因人而异。
发布于 2015-03-20 20:58:17
您可以使用以下代码
import java.util.Arrays; // must be imported
int[] priorities = {sleepPriority, eatPriority, recreationPriority};
Arrays.sort(priorities);
for (int i=priorities.length-1; 0<=i; i--) {
int priority = priorities[i];
if (priority == sleepingPriority) { sleep(); }
if (priority == eatingPriority) { eat(); }
if (priority == recreationPriority) { watchTv(); }
}
基本上,它将优先级放在数组中,对数组进行排序,并在其上运行for循环来运行函数。
发布于 2015-03-20 21:03:21
你可以用一个类和一个接口做到这一点。
public class Person {
int eatingPriority = 3;
int sleepingPriority = 2;
int recreationPriority = 1;
PriorityQueue<Action> actions;
void eat() { }
void sleep() { }
void watchTv() { }
public Person() {
actions = new PriorityQueue<Action>(new Comparator<Action>() {
@Override
public int compare(Action o1, Action o2) {
return o2.getPriority() - o1.getPriority();
}
});
actions.add(new Action() {
@Override
public int getPriority() {
return eatingPriority;
}
@Override
public void execute() {
eat();
}
});
actions.add(new Action() {
@Override
public int getPriority() {
return sleepingPriority;
}
@Override
public void execute() {
sleep();
}
});
actions.add(new Action() {
@Override
public int getPriority() {
return recreationPriority;
}
@Override
public void execute() {
watchTv();
}
});
}
public void satisfyNeeds() {
for (Action action : actions) {
action.execute();
}
}
interface Action {
public int getPriority();
public void execute();
}
}
发布于 2015-03-20 21:10:30
下面是另一个可能的实现:
abstract class Need {
abstract void satisfy();
}
class Eat extends Need {
@Override
public void satisfy() { /* eat ...*/}
}
class Sleep extends Need {
@Override
public void satisfy() { /* sleep ...*/}
}
class DrinkBeer extends Need {
@Override
public void satisfy() { /* drink beer ...*/}
}
class Person{
// TreeMap will sort the map in the key's natural order (a int here)
private Map<Integer, Need> needs = new TreeMap<>();
Person() {
add(new Eat(), 3);
add(new Sleep(), 2);
add(new DrinkBeer(), 1);
}
void add(Need need, int priority) {
needs.put(Integer.valueOf(priority), need);
}
void satisfyNeeds() {
for(Need need : needs.values())
need.satisfy();
}
}
https://stackoverflow.com/questions/29166869
复制相似问题