调节使用哪种方法

Era*_*ran 3 java bluej

假设我有一个类,myClass有两个方法 - addOne()addTwo().

我有另一个类,添加.该类有一个实例布尔变量oneOrTwo.此变量决定是否在myClass对象上使用addOne()addTwo().

我已经编写了所有使用addOne()方法的代码行,并且有很多行.我不想做的是复制它们,像这样:

if (oneOrTwo)
{
// all lines of code for addOne()
}
else
{
//all lines of code for addTwo()
}
Run Code Online (Sandbox Code Playgroud)

addOne()的代码行包括很多myClass.addOne()调用(当然我已经创建了一个新对象,一切都运行得很好,但我在这里一般都是为了避免让这个不必要的大帖子).我的问题是,如果我可以这样做:

if (oneOrTwo)
    addNumber() = addOne();
else
    addNumber() = addTwo();
Run Code Online (Sandbox Code Playgroud)

然后,而不是使用myClass.addOne()myClass.addTwo() ,我可以使用myClass.addNumber() .

Sog*_*rno 5

考虑继承和策略模式.

使用一个方法addNumber()创建一个抽象超类:

public abstract class AddNumber {

public abstract void addNumber(); 

}
Run Code Online (Sandbox Code Playgroud)

创建两个子类,每个子类都有自己的addNumber()实现:

public class AddOne extends AddNumber {

@Override
public void addNumber() {
// code to add one
}

}

public class AddTwo extends AddNumber {

@Override
public void addNumber() {
// code to add two
}

}
Run Code Online (Sandbox Code Playgroud)

在主类中创建一个以AddNumber对象作为参数的方法:

public class MyClass() {

public void add(AddNumber addNumber) {
addNumber.addNumber(); 
}

// other MyClass stuff

}
Run Code Online (Sandbox Code Playgroud)

然后,如果您需要在类中添加一个,只需使用AddOne对象作为参数调用add().同样,如果需要添加两个,则使用AddTwo对象作为参数调用add().

myClass.add(new AddOne()); 
myClass.add(new AddTwo());
Run Code Online (Sandbox Code Playgroud)

这称为策略模式,是这类问题的通用设计解决方案.