类和接口的区别,去除语法层面,谈谈编程层面的意义。
设计原则SOLID:
S:单一职责(SRP),Single Responsibility Principle
O:开-闭原则(OCP),Open-Closed Principle
L:里氏替换(LSP),Liskov Substitution Principle
I: 接口隔离(ISP),Interface Segregation Principle
D:依赖倒置(DIP),Dependency Inversion Principle
关于设计模式,经常会说面向接口编程,而面向接口编程,对应的是哪一个原则呢?
关于里氏替换和依赖倒置,应该是属于同一种编程技巧的两种表现形式。
如果要实现里氏替换,那边必须是依赖倒置的,如果遵循了依赖倒置,那么也实现了里氏替换原则
看一下JDBC的代码:
- public class DriverManager {
-
-
- // Worker method called by the public getConnection() methods.
- private static Connection getConnection(
- String url, java.util.Properties info, Class> caller) throws SQLException {
-
-
- Connection con = aDriver.driver.connect(url, info);
-
- return (con);
-
- }
- }
-
- public interface Driver {
-
- Connection connect(String url, java.util.Properties info)
- throws SQLException;
-
- }
-
- public interface Connection extends Wrapper, AutoCloseable {
-
-
- }
驱动管理类,获取连接的方法,就是依赖倒置原则的实现,面向的接口编程,依赖抽象。
抛开具体的设计模式,在看不同框架的源码时,一般他们都是遵循了面向接口编程的,也就是依赖倒置。在变量类型、方法返回类型、入参类型都是接口或者抽象类,这样就实现了依赖倒置,也就是依赖接口。 这样做的优点,就是可以有不同的实现类型,而不用改动高层次的逻辑。
再谈谈类和接口在编程中存在的意义,接口或者抽象类,可以用来定义目标、方向,属于高层次的;面向对象的继承和多态,完成了将目标、方向转化为行动,而行动就是具体的实现类。目标只有一个,而行动可以有很多。这也许就是类和接口存在的意义吧。
然而,在工作中需要根据具体的需求进行开发,也不用过度使用设计模式,为了使用而使用,需要自己把握。