面向对象还是面向接口
在我们学习java的时候,我们一直在说java是面向对象编程,这个思想在我的脑子里也是根深蒂固.但是这个只是在写代码的阶段,等我们进入企业之后,我们更多的会听到人说面向接口编程.面向接口编程在我们生活中也是有很多实例.比如插座,为什么所有的插座能做到究极统一,可以支持所有的人用.这就是因为插座在生产的时候是按照统一的标准来生产的,这个标准就可以理解为我们的接口思想.
代码实现
比如我现在是一个饭店的老板,我的饭店主要经营的是川菜和陕菜,
public class FoodTwo {
public void cook ( ) {
System. out. println ( "陕菜" ) ;
}
}
public class Food {
public void cook ( ) {
System. out. println ( "川菜" ) ;
}
}
public class CookUser {
public void cook ( Food food) {
food. cook ( ) ;
}
public void cook ( FoodTwo foodTwo) {
foodTwo. cook ( ) ;
}
}
public static void main ( String[ ] args) {
Food food = new Food ( ) ;
FoodTwo foodTwo = new FoodTwo ( ) ;
CookUser cookUser = new CookUser ( ) ;
cookUser. cook ( food) ;
cookUser. cook ( foodTwo) ;
}
万事俱备,饭店开张了,但是过了几天,来了一个小伙子要点粤菜,我们厨师不会做.那这个时候就要想办法了,有钱不赚不是老板的风格啊.这块可以写一个做菜的抽象类,然后厨师实现我这个抽象类就可以实现做菜了.
public abstract class ChineseFood {
public abstract void cook ( ) ;
}
有了这个之后,只要是中国菜都可以做,粤菜做出来就轻而易举了
public class FoodThree extends ChineseFood {
@Override
public void cook ( ) {
System. out. println ( "做粤菜" ) ;
}
}
然后又营业了几个月,没一点问题,但是这天来了个外国友人,想吃牛排.那我们肯定不能说不会啊,要不然就被嘲笑了.但是我一想我的厨师虽然上次升级了,但是还是只会做所有的中国菜啊.几经思考,来一个食物的接口,里面有一个做饭方法,不关你是啥饭,只要是吃的,我都能给你做出来
public interface AllFood {
public abstract void cook ( ) ;
}
public class Cattle implements AllFood {
@Override
public void cook ( ) {
System. out. println ( "做牛排" ) ;
}
}
这个时候厨子也不用上面那么复杂的继承等一系列操作了,想做什么菜,就让这个菜实现食物接口,然后让厨师面向接口编程就好了
public class CookUser {
public void cook ( AllFood allFood) {
allFood. cook ( ) ;
}
public class Cattle implements AllFood {
@Override
public void cook ( ) {
System. out. println ( "做牛排" ) ;
}
}
public static void main ( String[ ] args) {
Food food = new Food ( ) ;
FoodTwo foodTwo = new FoodTwo ( ) ;
CookUser cookUser = new CookUser ( ) ;
cookUser. cook ( food) ;
cookUser. cook ( foodTwo) ;
cookUser. cook ( new Cattle ( ) ) ;
}
这个可能还不太明显,那现在有一个甜品大赛,我要派人参加,但是我只有一个厨子,厨子只会做菜啊,但是一想,甜品也可以吃,那就简单了,写一个甜品类让他实现食物接口,然后我的厨子就会做了
public class Sweet implements AllFood {
@Override
public void cook ( ) {
System. out. println ( "做甜品" ) ;
}
}
cookUser. cook ( new Sweet ( ) ) ;
这样只要是吃的,我的厨子都可以做,相比于上面我加个粤菜就要对原来的代码一顿改的操作,用接口来处理我没有改原来的代码,你想吃啥,就重新来个类,只要符合我这个接口,就可以给你做出来.
总结
我觉得面向接口编程在项目量很大的时候,能发挥出意想不到的的效果,因为他的代码维护或者扩展起来都很方便,就像插座一样,一个标准大家共用,极大地减少了代码之间的耦合性. 但是我觉得面向接口的思想也是建立在面向对象的基础之上来实现的.