这一章节我们来讨论一下接口怎么样解耦?使得代码灵活性增强。
我们先来看看下面的代码:
package com.ray.ch07;
public class Test {
public static void test(Vehicle vehicle) {
vehicle.test();
}
public static void main(String[] args) {
test(new BMW());
test(new Audi());
}
}
class Vehicle {
public void test() {
System.out.println("Vehicle test");
}
}
class BMW extends Vehicle {
@Override
public void test() {
System.out.println("BMW test");
}
}
class Audi extends Vehicle {
@Override
public void test() {
System.out.println("Audi test");
}
}
我们上面的代码主要描述的是车辆的测试。
我们再上另外一组代码:
package com.ray.ch07;
public class Test {
public static void test(Instrument instrument) {
instrument.test();
}
public static void main(String[] args) {
test(new Wind());
test(new Bass());
}
}
class Instrument {
public void test() {
System.out.println("Instrument test");
}
}
class Wind extends Instrument {
@Override
public void test() {
System.out.println("Wind test");
}
}
class Bass extends Instrument {
@Override
public void test() {
System.out.println("Bass test");
}
}
上面一组代码主要描述乐器的测试。
对比两组代码,其实大家会发现,测试的主代码里面大家都差不多,但是由于乐器和汽车都不是继承同样的基类,因此,测试代码不能够通用。
不能够通用的原因主要就是Instrument和Vehicle这两个类与Test耦合太深。我们下面通过接口,把两个类组合起来,使得Test里面的代码可以通用。
package com.ray.ch07;
public class Test {
public static void test(TestObjectInterface testObjectInterface) {
testObjectInterface.test();
}
public static void main(String[] args) {
test(new Wind());
test(new Bass());
test(new BMW());
test(new Audi());
}
}
interface TestObjectInterface {
void test();
}
class Instrument implements TestObjectInterface {
@Override
public void test() {
System.out.println("Instrument test");
}
}
class Wind extends Instrument {
@Override
public void test() {
System.out.println("Wind test");
}
}
class Bass extends Instrument {
@Override
public void test() {
System.out.println("Bass test");
}
}
class Vehicle implements TestObjectInterface {
@Override
public void test() {
System.out.println("Vehicle test");
}
}
class BMW extends Vehicle {
@Override
public void test() {
System.out.println("BMW test");
}
}
class Audi extends Vehicle {
@Override
public void test() {
System.out.println("Audi test");
}
}
我们建立一个通用接口,然后两个基类分别实现接口,然后通过向上转型,实现多态,使得TestObjectInterface这个父类指向各个不同的子类的,从而调用不同子类的方法。
在这里我们再扩展一下,上面的代码里面其实是运用了策略设计模式。TestObjectInterface一直是执行算法里面固定的部分,然后通过不同类型的传入,分别执行不同的实现。
总结:我们这一章节主要讲述了接口怎样解耦。
这一章节就到这里,谢谢。
-----------------------------------