一。适用场景:将对象进行的操作与对象本身进行分离的场景。
二。示例。比如一个整形数组,可以按照升序和降序进行排序。可以定义一个接口,该接口包含两个命令:ascendSort(升序排序)和descendSort(降序排序)。
接口定义如下:
package cn.edu.tju.app;
public interface SortCommand {
void ascendSort(int[] array);
void descendSort(int [] array);
}
然后定义两个类,分别使用冒泡排序和选择排序来实现SortCommand中的方法。
package cn.edu.tju.app;
public class BubbleSort implements SortCommand {
@Override
public void ascendSort(int[] array) {
int length=array.length;
for(int i=0;i<length;i++){
for(int j=i+1;j<length;j++){
if(array[i]>array[j]){
int temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
}
@Override
public void descendSort(int[] array) {
int length=array.length;
for(int i=0;i<length;i++){
for(int j=i+1;j<length;j++){
if(array[i]<array[j]){
int temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
}
}
package cn.edu.tju.app;
public class SelectSort implements SortCommand {
@Override
public void ascendSort(int[] array) {
int length=array.length;
for(int i=0;i<length;i++){
int minValue=array[i];
int minValueIndex=i;
for(int j=i+1;j<length;j++){
if(minValue>array[j]){
minValue=array[j];
minValueIndex=j;
}
}
int temp=array[i];
array[i]=minValue;
array[minValueIndex]=temp;
}
}
@Override
public void descendSort(int[] array) {
int length=array.length;
for(int i=0;i<length;i++){
int maxValue=array[i];
int maxValueIndex=i;
for(int j=i+1;j<length;j++){
if(maxValue<array[j]){
maxValue=array[j];
maxValueIndex=j;
}
}
int temp=array[i];
array[i]=maxValue;
array[maxValueIndex]=temp;
}
}
}
然后在主类中定义两个方法
public static void ascendSortArray(int[] array, SortCommand sort){
sort.ascendSort(array);
}
public static void descendSortArray(int[] array, SortCommand sort){
sort.descendSort(array);
}
这两个方法的第二个参数的类型为SortCommand类型,接下来,分别调用这两个方法,并给这两个方法的第二个参数传入具体实现了SortCommand接口的实现类(new BubbleSort()和new SelectSort()),
int[] array={14,23,9,55,42,8,91,77};
ascendSortArray(array,new BubbleSort());
printArray(array);
descendSortArray(array,new BubbleSort());
printArray(array);
System.out.println("__________________________________________________________________________________");
ascendSortArray(array,new SelectSort());
printArray(array);
descendSortArray(array,new SelectSort());
printArray(array);
执行结果如下:
_____________________________________________
8
9
14
23
42
55
77
91
_____________________________________________
_____________________________________________
91
77
55
42
23
14
9
8
_____________________________________________
__________________________________________________________________________________
_____________________________________________
8
9
14
23
42
55
77
91
_____________________________________________
_____________________________________________
91
77
55
42
23
14
9
8
_____________________________________________
Process finished with exit code 0
这样,就把要处理的对象(整形数组array)和具体的排序动作(在BubbleSort和SelectSort类中)进行了分离。
主类的完整代码如下:
package cn.edu.tju.app;
public class CommandTest {
public static void main(String[] args) {
int[] array={14,23,9,55,42,8,91,77};
ascendSortArray(array,new BubbleSort());
printArray(array);
descendSortArray(array,new BubbleSort());
printArray(array);
System.out.println("__________________________________________________________________________________");
ascendSortArray(array,new SelectSort());
printArray(array);
descendSortArray(array,new SelectSort());
printArray(array);
}
public static void ascendSortArray(int[] array, SortCommand sort){
sort.ascendSort(array);
}
public static void descendSortArray(int[] array, SortCommand sort){
sort.descendSort(array);
}
public static void printArray(int[] array){
System.out.println("_____________________________________________");
for(int i: array){
System.out.println(i);
}
System.out.println("_____________________________________________");
}
}