1、定义接口
使用interface来定义一个接口。接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成。定义接口的基本格式如下:
[修饰符] interface 接口名 [extends 父接口名列表]{
[public] [static] [final] 常量;[public] [abstract] 方法;
}
· 一个类只能 implements 某个接口,不能 继承extends 某个接口,但接口可以继承接口,而且可以继承多个接口
· 接口是一种特殊的 abstract class
· 接口中定义的属性必须是 public static final 类型的,定义的方法必须是 public abstract 类型的,因此这些修饰符可以部分或者全部省略
· 接口中定义的属性值不能在实现类中被改变
· 如果一个类只实现了一个接口的部分方法则该类必须声明为 abstract,
· 一个类可以在继承一个父类的同时实现一个或多个接口,但 extends 必须在 implements 之前
· 不可以 new 接口对象,但可以定义一个 接口的引用 来指向 实现接口的对象,达到多态目的
》》--》》 面 向 接 口 编 程 (command 命令模式)
public interface Command // 通过一个 command interface 让 ProcessArray 与具体的处理方式分离
{
void process(int[] target) ; // 定义一个 处理数组 的方法,具体的处理方式 由其实现类来定义
}
class PrintCommand implements Command { // 用于打印数组元素的Command实例
public void process(int[] target) {
System.out.print("数组中的元素:");
for (int temp : target) {
System.out.print(temp+" ");
}
}
}
class AddCommand implements Command { // 用于计算数组元素和的Command实例
public void process(int[] target) {
int sum = 0;
for (int temp : target) {
sum += temp;
}
System.out.print("数组中元素的和:" + sum);
}
}
class ProcessArray { // 代理类,用于回调
public void arrayWork(int[] target, Command cmd) {
cmd.process(target);
}
}
// 测试类
public class Demo {
public static void main(String[] arga) {
ProcessArray pa = new ProcessArray();
int[] arr = { 1, 3, 5, 7 };
pa.arrayWork(arr, new PrintCommand()); // 使用
pa.arrayWork(arr, new AddCommand()); // 使用
}
}
总结(command模式优点):
解耦了发送者和接受者之间联系。 发送者调用一个操作,接受者接受请求执行相应的动作,因为使用Command模式解耦,发送者无需知道接受者任何接口。
不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作.
将这些命令封装成在一个类中,然后用户(调用者)再对这个类进行操作,这就是Command模式,换句话说,本来用户(调用者)是直接调用这些命令的,如菜单上打开文档(调用者),就直接指向打开文档的代码,使用Command模式,就是在这两者之间增加一个中间者,将这种直接关系拗断,同时两者之间都隔离,基本没有关系了.
显然这样做的好处是符合封装的特性,降低耦合度,Command是将对行为进行封装的典型模式,Factory是将创建进行封装的模式,
从Command模式,我也发现设计模式一个"通病":好象喜欢将简单的问题复杂化, 喜欢在不同类中增加第三者,当然这样做有利于代码的健壮性 可维护性 还有复用性.