从头认识java-7.3 接口怎样解耦?

这一章节我们来讨论一下接口怎么样解耦?使得代码灵活性增强。

我们先来看看下面的代码:

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一直是执行算法里面固定的部分,然后通过不同类型的传入,分别执行不同的实现。

总结:我们这一章节主要讲述了接口怎样解耦。

这一章节就到这里,谢谢。

-----------------------------------

目录

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-26 13:45:32

从头认识java-7.3 接口怎样解耦?的相关文章

表格存储新手指南:Java SDK异步接口的使用

原文地址 本篇文章主要会介绍下表格存储的Java SDK提供的异步接口,如何使用以及应用场景. 为什么需要异步? 异步提供了一个non-blocking, event-driven的编程模型,能够将系统不同层级的模块进行层次化的解耦,能够利用多核并行执行任务,提高性能. 现如今,一个大型的系统,系统级调优的最关键一步,就是异步化.异步化最常改造的是远程RPC或者数据库访问部分,表格存储作为一个底层数据库产品,需要提供异步接口来适应这个潮流. 在表格存储内部,我们也有一些使用异步来优化系统的例子,

JavaSE入门学习21:Java面向对象之接口(interface)(二)

一接口实现的多态 在上一篇博文:JavaSE入门学习20:Java面向对象之接口(interface)(一)中提到了接口的实现存在多态性,那么 这一篇主要就要分析接口实现的多态. 实例一 Test.java源文件代码: public class Test{ public static void main(String[] args){ //实现接口Singer Singer s1 = new Student("Amy"); s1.sing(); s1.sleep(); s1.study

java的List接口的实现类 ArrayList,LinkedList,Vector 的区别

Java的List接口有3个实现类,分别是ArrayList.LinkedList.Vector,他们用于存放多个元素,维护元素的次序,而且允许元素重复. 3个具体实现类的区别如下: 1. ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问.数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要将已经有数组的数据复制到新的存储空间中.当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制.移动.代价比较高.因此,它

老白的JAVA课程13 接口

之前我们讲到了java4大特征的最后一个抽象的特征,其实在抽象这个特征里面,我们还有一个特征-接口,今天我们就来学一学接口.  用电脑,手机等电子产品来比喻接口,可以更好的理解,比如用符合接口的插头就可以了.  接口具有很好的扩展性,方便.  接口的由来   例子:奥拓奥迪都是汽车,汽车的维护都是可以用调节引擎和更换汽油的方法,那么奥拓和奥迪也都可以:但是有了更多的维护对象以后,比如说大货车,卡车等等,其他的对象不一定需要每一步维护,或者都不需要维护:又比如不同枪支有不同特性的例子.  因此,我

JDK1.8 java.io.Serializable接口详解

java.io.Serializable接口是一个标志性接口,在接口内部没有定义任何属性与方法.只是用于标识此接口的实现类可以被序列化与反序列化.但是它的奥秘并非像它表现的这样简单.现在从以下几个问题入手来考虑. 希望对象的某些属性不参与序列化应该怎么处理? 对象序列化之后,如果类的属性发生了增减那么反序列化时会有什么影响呢? 如果父类没有实现java.io.Serializable接口,子类实现了此接口,那么父类中的属性能被序列化吗? serialVersionUID属性是做什么用的?必须申明

java抽象类和接口

1.抽象类 抽象类在概念上描述的是抽象世界,抽象类刻画了公有行为的特征,并且通过继承机制传送给它的派生类.抽象类使用关键字abstract 修饰,语法如下: abstract class 类名{ 类体; } 抽象方法是指在抽象类中某些成员方法没有具体的实现,只有方法声明.抽象方法使用关键字abstract 修饰,格式如下: public abstract 返回类型 方法名([参数列表]); 抽象类和抽象方法的具体规则如下: 1.用abstract 关键字修饰一个类时,该类叫做抽象类,用abstr

java----数据结构与算法----JavaAPI:java.util.Collection接口

Java API--java.util.Collection接口 /** * @author chen * @date 20170317 * @description:本程序讲述Collection接口 * java.util.Collection * 概述:Collection接口是Set和List接口的父接口,Collection接口中定义了一些 * 用于集合元素操作的方法,被其子接口以及子接口的实现类所继承 * 构造函数 * java中接口不能有构造函数 * 成员函数: * [1]概述,由

java中set接口的用法

java中的set接口有如下的特点: 不允许出现重复元素: 集合中的元素位置无顺序: 有且只有一个值为null的元素. 因为java中的set接口模仿了数学上的set抽象,所以,对应的数学上set的特性为: 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次. 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的.集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序.但就集合本身的特性而言,元素之间没有必然的序. 空集的性质:空集是一切集合的子集 S

JAVA学习经验--总结JAVA抽象类和接口

* --总结JAVA抽象类和接口  * 1.抽象类:  *             1>抽象类可以修饰方法,修饰类,但不能修饰属性,不能被实例化  *             2>抽象类可以被继承,只能是单继承,继承抽象类必须实现抽象方法  *             3>抽象类不能被static ,fina,private一起修饰  *             4>抽象类是有多态性的  *  * 2.接口:  *             1>接口是一种特殊的抽象类,不能被实