面向接口编程的一些总结

1.面向接口编程产生的背景

  在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成,在这种情况下各个对象内部是如何实现自己对系统设计人员来说就不那么重要了.而各个对象之间的协作关系则成为系统设计的关键,在日常工作中,如果别人修改的代码频繁的影响到你,表现在某个模块的改动引起其他模块的大规模调整,说明模块接口没有很好的设计.所有面向接口编程显得尤为重要.

2.什么是面向接口编程?

   面向接口编程就是先把客户的业务逻辑线提取出来,作为接口,业务具体实现通过该接口的实现来完成.当客户需求变化的时候,只需编写该业务逻辑的新的实现类,通过更改配置文件(例如Spring框架)中该接口的实现类就可以完成需求,不需要修改现有的代码,减少对系统的影响

3.面向接口编程的优点?

  1.降低程序的耦合性,能够最大限度的解耦合

  2.易于程序的扩展

  3.有利于程序的维护

4.接口编程在设计模式中的体现:开闭原则

  那么是么是开闭原则呢?一句话概括:对扩展开放,对修改关闭.

  开放封闭原则的简单概述:开放-封闭原则是面向对象设计的核心所在.遵循这个原则可以带来面向对象技术所声称的巨大好处:

   可维护  可扩展  可复用  灵活性好

    开发人员应该仅对程序中呈现出频繁的变化那部分作出抽象,然而对于应用程序中的每个部分进行刻意的抽象同样并不是一个好主意,拒绝不成熟的抽象和抽象本身一样重要(切记,切记).

  面向接口将具体逻辑与实现分开,减少了各个类之间的相互依赖,当各个类变化时候,不需要对已经编写的类进行改动,添加新的实现类可以了,不用担心新改动的类对系统的其他模块造成影响

5.关于抽象类的设计是如何体现多态的?

   静态类型语言通常设计为可以“向上转型”。当给一个类变量赋值时,这个变量的类型既可以使用这个类本身,也可以使用这个类的超类。就像看到天上有只麻雀,既可以说“一只麻雀在飞”,也可以说“一只鸟在飞”,甚至可以说成“一只动物在飞”。通过向上转型,对象的具体类型被隐藏在“超类型”身后。当对象类型之间的耦合关系被解除之后,这些对象才能在类型检查系统的监视下相互替换使用,这样才能看到对象的多态性

抽象类的一些作用:

    1.向上转型

   举例:

   麻雀对象和鸭子对象的类型都隐藏在抽象类Dird类型之后,隐藏对象的的具体类型之后,麻雀鸭子才能被交换使用,这是让对象表现出多态性的必经之路

 2.建立一些契约继承自抽象类的具体类都会继承抽象类里的abstract方法,并且要求覆写它们。这些契约在实际编程中非常重要,可以帮助编写可靠性更高的代码。

    比如在命令模式中,各个子命令类都必须实现execute方法,才能保证在调用command.execute的时候不会抛出异常。如果让子命令类OpenTvCommand继承自抽象类Command:

 
 
abstract class Command{
  public abstract void execute();
}

public class OpenTvCommand extends Command{ 
  public OpenTvCommand (){};
  public void execute(){ 
    System.out.println( "打开电视机" );
  }
}
自然有编译器帮助检查和保证子命令类OpenTvCommand覆写了抽象类Command中的execute抽象方法。如果没有这样做,编译器会尽可能早地抛出错误来提醒正在编写这段代码的程序员

  总而言之,不关注对象的具体类型,而仅仅针对超类型中的“契约方法”来编写程序,可以产生可靠性高的程序,也可以极大地减少子系统实现之间的相互依赖关系,这就是面向接口编程


6.使用抽象类还是接口?

  分析:   在使用接口的同时仍旧可以使用抽象类,不过这时抽象类的作用是实现行为,而不是定义行为.只要实现行为的类遵从接口定义,即使它改变了父抽象类,也不用改变其它代码与之交互的方式。特别是对于公用的实现代码,抽象类有它的优点。抽象类能够保证实现的层次关系,避免代码重复。然而,即使在使用抽象类的场合,也不要忽视通过接口定义行为模型的原则。从实践的角度来看,如果依赖于抽象类来定义行为,往往导致过于复杂的继承关系,而通过接口定义行为能够更有效地分离行为与实现,为代码的维护和修改带来方便。

  行为模型要通过接口定义而不是抽象类. 抽象类结合接口使用,抽象类的作用是实现行为,而不是定义行为.

采用接口还是抽象类参考一下两点:

    1. 如果要创建不带任何方法定义和成员变量的基类,那么就应该选择接口而不是抽象类。

    2. 如果知道某个类应该是基类,那么第一个选择的应该是让它成为一个接口,只有在必须要有方法定义和成员 变量的时候,才应该选择抽象类。因为抽象类中允许存在一个或多个被具体实现的方法,只要方法没有被全部  实现该类就仍是抽象类。

7.关于接口特性的一些整理

1. 接口中的方法可以有参数列表和返回类型,但不能有任何方法体。

2. 接口中可以包含字段,但是会被隐式的声明为static和final。

3. 接口中的字段只是被存储在该接口的静态存储区域内,而不属于该接口。

4. 接口中的方法可以被声明为public或不声明,但结果都会按照public类型处理。

5. 当实现一个接口时,需要将被定义的方法声明为public类型的,否则为默认访问类型,Java编译器不允许这种情况。

6. 如果没有实现接口中所有方法,那么创建的仍然是一个接口。

7. 扩展一个接口来生成新的接口应使用关键字extends,实现一个接口使用implements。


    

猜你喜欢

转载自blog.csdn.net/allen_forv/article/details/80768877