模板模式
抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会大致保留抽象类的行为方式。如果编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,这就是一种模板模式的设计方式。
抽象方法不能有方法体、抽象类不能实例化、含有抽象方法的类只能被定义成抽象类、抽象类的构造器不能用于创建实例,主要是用于被其子类调用。
当使用abstract修饰类时,表明这个类只能被继承;当使用abstract修饰方法时,表明这个方法必须由子类提供实现(即重写),而final修饰的类不能被继承,final修饰的方法不能被重写,因此final和abstract永远不能同时使用。
abstract不能用于修饰成员变量,不能用于修饰局部变量,不能修饰构造器。
接口是一种特殊的抽象类。
接口体现的是一种规范,抽象类体现的是一种模板式的设计。
命令模式
生活之中有许多开关,通过开关可以控制电器的打开和关闭,例如电灯、电脑、风扇。开关与电灯、排气扇并无直接关系,一个开关安装之后可能用来控制电灯,也可能用来控制排气扇或者其他电器。在这里可把开关看作是个接口,电器看作是要处理的对象,不管他是什么电脑电灯的,只要它需要有开关,开启和关闭看作是要执行的行为。可以考虑使用一个Command接口来定义一个方法,用这个方法来封装"开启/关闭行为"。
public interface Command {
void process(String s);
}
定义打开行为实现类:
public class On implements Command {
@Override
public void process(String s) {
// TODO Auto-generated method stub
String p=s+"被打开";
System.out.println(p);
}
}
定义关闭行为实现类:
public class Off implements Command {
@Override
public void process(String s) {
// TODO Auto-generated method stub
String p=s+"被关闭";
System.out.println(p);
}
}
处理对象的处理类,在这个处理类中包含了一个process()方法,这个方法无法确定处理对象的处理行为(打开/关闭),所以定义该方法时只是传入接口对象:
public class DoThing {
public void process(String name,Command cmd) {
cmd.process(name);
}
}
单元测试:
@Test
public void t() {
DoThing dt=new DoThing();
dt.process("电脑", new On());
dt.process("电脑", new Off());
dt.process("风扇", new On());
dt.process("风扇", new Off());
dt.process("电视", new On());
dt.process("电视", new Off());
}
命令模式的小案例
要求通过命令模式自设计数组自加、平方
接口:Command
public interface Command {
void process(int[] element);
}
自加实现类:Plus
public class Plus implements Command{
@Override
public void process(int[] element) {
// TODO Auto-generated method stub
for (int i = 0; i < element.length; i++) {
element[i]+=element[i];
}
System.out.println(Arrays.toString(element));
}
}
自乘(平方)实现类:Square
public class Square implements Command{
@Override
public void process(int[] element) {
// TODO Auto-generated method stub
for (int i = 0; i < element.length; i++) {
element[i]*=element[i];
}
System.out.println(Arrays.toString(element));
}
}
定义数组处理类:ArrayDo
public class ArrayDo{
public void process(int[] array,Command cmd) {
cmd.process(array);
}
}
单元测试:
@Test
public void t1() {
ArrayDo ad=new ArrayDo();
int[] arr= {5,1,2,-4};
int[] brr= Arrays.copyOf(arr, arr.length);
ad.process(arr, new Square());//让arr每个数都平方一次
ad.process(brr, new Plus());//让brr每个数都自加一次
}
转载:https://blog.csdn.net/qq_30433703/article/details/105392333