看了这里的一些帖子和很多地方的帖子,很多人都在问为什么非要interface或者abstract class,然后还要在写一个实现类,而其实,我就市要做一个很简单的功能!?
对,如果你制作一个简单的功能,我同意你可以直接使用spring hibernate等框架来写,他们本身的好处也是干这个的。
但是,中国人有句老话,叫做杞人忧天,很多的时候,你有没有内心问自己,这个系统,我设计的,如果老板要改动,我可以在很短的时间内做到改变么?
当你问自己这个问题的时候,你就已经把直接写实现类的做法怀疑了。
面向接口的原则,不是只出现在程序员或者说IT界,接口设计是人类对一个问题或者一个物体的概括理解能力的表现。我们日常生活中处处有接口。
在我作一个简单的说明之前,我要补充以下,系统框架中,除了层的概念,还有一个叫做boundary,每一个layer(层)是由不同的boundary(box)组成。
举例一二三,比如,简单的说,发电厂就是实现类(implementation class),每个发电厂都是独立的boundary,而发电厂就是统称为一个layer,也许还不明白,比如,我们平时说,发电厂,没人关心你家的电来自于那个发电厂,而关心的是你家的插座有没有电,所以三项插座,二项插座至十发电厂给用户的最终接口。发电厂之间也是通过一个特殊的工业接口来互相访问,所以,这也是为什么说,有时候有的发电厂在夏天负担过重,就可以把负担分给其他的电场供应。反过来,如果让老百姓天天关心的是发电厂,而不是插座,那你觉得这样的城市电力设计是不是很糟糕呢?
在举个例子,比如果.....,嗯,好,就说汽车,汽车都见过吧,四个轮子,一个方向盘,但是,你们有没有发现,有时候你们的汽车上面的音响系统坏掉或者要升级的时候,只需要取下中间面板上面的那个独立的音响播放器,然后买一个新的,由汽车维修给你们撞上就可以了,不管是飞利浦,boss还是简单的radio的和卡带的,你们从来不会在买一个汽车音响的时候关心他能不能安在汽车上,而是可以完全关心颜色,款式,品牌这些问题上,如果,反过来设计,每一个汽车品牌都直接实现自己的独立设计,不遵循工业接口,那你觉得这样的汽车音响会有很多选择么?
最后在举一个我们每天息息相关的例子,门,每天人们通过不同的门,进入或者走出不同的地方,而门就是那个地方或者建筑物的接口,如果说,我们反过来,每个大厦或者建筑物都直接应用自己喜欢的实现进出的方式,那你们觉得每天的生活会不会有点太麻烦?
我举例子只是来简单的解释一下,接口不是一个繁琐的过程,而是每个工业,甚至是每天生活中,我们必须应用到的东西,所以,如果看待现在的文明社会用程序员的方式的话,那么就是一种接口世界,现实生活中很多人叫做标准或者协议,由看得见摸得找的,也有看不见摸不着的接口。
很多人可能想对我举的例子进行进一步的反驳,其实没有必要,如果你要跟我探讨每一个例子来映射程序中的接口问题,那就是在抬杠,抬杠很浪费时间,所以,我不会跟你探讨例子的问题,那就是个例子,而这个例子是每天确实发生的,使用的。
希望能解释明白一点在程序设计中接口编程的优势所在。
分享到:
相关推荐
调用接口怎么知道使用的是哪个实现类 Java通过接口调用方法的时候,怎么知道调用的是哪个实现类 当调用接口中的方法时,如何判定用的是哪个实现类 一个接口有多个实现类,怎么知道调用了哪个实现类
4. **使用接口**:在需要的地方,我们使用实现了接口的对象,而不是直接创建实现类的实例。这样,我们的代码对具体实现保持无知,增强了灵活性。 5. **配置和管理**:在应用的配置中,我们可以指定哪些实现类应该被...
- 当通过接口引用调用方法时,该方法必须在接口中已经声明,并且在实现类中的实现必须与接口中定义的完全一致。 - 子类可以重写父类的方法,但这并不意味着父类引用不能调用子类的其他方法。如果子类有特有的方法,...
4. **匿名类实现接口**:在创建对象时直接实现接口,不需要声明单独的类,常用于内部类和回调函数。 5. **方法调用**:通过接口引用调用方法,实际执行的是实现该接口的具体类的对象的方法。 理解这些概念对于深入...
接口的使用使得代码更加灵活,易于扩展,同时也支持多继承,这是类无法直接实现的。本文将深入探讨.NET中的接口实现、接口定义、接口与类的关系,以及接口与类的区别。 ### 接口定义 接口通过`interface`关键字...
这两个实现类都使用了Spring的`@Service`注解,标记为Spring管理的bean。`@Service`注解通常用于表示业务层的服务类。在这里,它们分别注入了不同类型的`OAXmlDealHandle`实现,通过`@Resource`注解来指定类型,分别...
然后,我们创建了两个具体实现类:Human 和 Monkey,它们都继承了 LivingThing 抽象类。在 Human 和 Monkey 中,我们实现了抽象方法 dance(String dancingStyle)。 接口 接口是一种特殊的抽象类,它不能被实例化,...
本篇将详细讲解DLL导出类的三种常见方法:导出接口类、导出类指针以及导出类,并说明为什么通常不建议直接导出类。 1. 导出接口类 接口类(Interface Class)是一种只包含纯虚函数的抽象基类,不包含任何数据成员...
匿名内部类是Java中的一种特殊类,它没有名称,可以直接实例化,并且可以继承一个类或实现一个(多个)接口。在接口回调的场景下,我们可以使用匿名内部类快速地创建一个实现了接口的实例,而无需定义一个新的类。...
如果属性不是公共的,则实现接口的分类器不需要显式定义这些属性,只需要保证其实现符合接口的要求即可。 2. **定义关联**:当接口定义了一个关联时,所有实现该接口的分类器都必须实现这个关联。这意味着,实现...
一个实现类一般实现了相当多的接口,为了避免所实现的接口出现方法重名,另外对这些方法有好的分类,故把实现类对象赋值给接口类型的对象,而不是直接用类来创建对象。由于创建的对象是某个接口类型的,则这个对象就...
本节将深入探讨`Collection`接口及其常用的子接口与实现类。 首先,`Collection`接口概述:它是Java集合框架的根接口,定义了集合的基本操作,如添加、删除和遍历元素。所有集合类都直接或间接地继承自`Collection`...
接口通过`interface`关键字定义,而类通过`implements`关键字实现接口。 2. **反射(Reflection)** 反射是.NET框架提供的一种能力,允许程序在运行时获取类型信息,并能创建和操作这些类型实例。`System.Type`类...
如果实现类是抽象类,则可以选择部分实现或者不实现接口中的方法。 #### 示例 假设有一个接口`Animal`,其中包含一个抽象方法`makeSound()`。 ```java public interface Animal { void makeSound(); } ``` 可以...
除了上述直接生成方法的方式,Idea 还提供了其他一些与接口相关的快捷操作,例如在实现类中快速导航到接口方法(`Ctrl + B`),或者查看接口的实现类列表(`Ctrl + H`,选择 "Implementing Classes")等。...
这样做的好处是保持接口的纯粹性,确保所有实现该接口的类只关注接口定义的行为,而不会受到额外数据成员的影响。 6. **智能指针与接口**:在C++11及更高版本中,使用智能指针(如`std::unique_ptr`和`std::shared_...
1. **实例化**:抽象类不能直接实例化,而接口也不能实例化,但是任何类都可以实现接口,而无需继承。 2. **成员实现**:抽象类可以包含抽象和非抽象成员,而接口只能包含抽象成员。 3. **继承限制**:C#中一个类...
实现接口的类或函数需要遵循接口定义的函数指针类型,提供相应的函数实现。在使用时,通过接口结构体的实例,调用其内部的函数指针,达到调用实际函数的目的。 6. **多态性**: 尽管C语言没有内置的多态机制,但...
静态方法不属于接口的任何实现类,而是直接通过接口调用。 ```java public interface MyInterface { static void staticMethod() { System.out.println("执行静态方法"); } } ``` 6. 接口与多态: 接口是多态性...
接口可以继承多个其他接口,实现多继承的功能,但不能继承类或实现其他非接口的实体。 内部类,也称为嵌套类,可以在类的内部定义,分为静态内部类和非静态内部类(也叫成员内部类)。非静态内部类可以直接访问外部...