<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    初探设计:Java接口和抽象类何时用?怎么用?

    Writer????? :BYSocket(泥沙砖瓦浆木匠

    今天犯了个错:

    接口变动,伤筋动骨,除非你确定只有你一个人在用”。哪怕只是throw了一个新的Exception。哈哈,这是我犯的错误。

    一、接口和抽象类

    类,即一个对象。

    抽象类,就是抽象出类的基础部分,即抽象基类(抽象类)。官方定义让人费解,但是记忆方法是也不错的 — 包含抽象方法的类叫做抽象类。

    接口就是把抽象的深度更深,它就像用简短的非逻辑的一些规则表示类之间的关系??梢员茸餍?,比如通信使用的UDP/TCP协议等。

    小结类与接口是Java语言的基本抽象单元。

    二、为什么有接口的两大原因

    a. 向上转型为多个基类型

    如此,会给开发带来相当大的灵活性。比如女神刘亦菲(Class),实现了 明星 和 女人 的接口。这样在复杂的继承结构的某类中使用它,以后在调用seeStar(Star star)或者seeWomen(Women women)方法时,只要传入其实现类(刘亦菲)即可。这也就是常说的接口可以多实现,达到了完全解耦。

    b. 可复用性

    即根据接口定义,让创建类有了遵循的”协议“(规则)。whatever~ 要做的仅仅建立一个接口,为了保证生成对象的非耦合。如此而来,接口的使用让代码更具可复用性,通用性灵活性。但并不是那么万能。后面使用守则会讲到。

    ?

    三、怎么用?

    前人大牛总结了一些设计模式,也就是接口衍生出的一些设计模式。设计模式就是语法糖的甜蜜吧。接口让我们尝到了甜蜜。和我身边的一杯starBucks的热巧克力一样。有点太甜。比如:

    a.策略模式方法中参数使用接口,传入的参数对象(实现类)即包含了执行的代码。如图:

    image
    调用过程如下,在方法中出入实现而已:

    image

    ?

    b. 适配器模式接口适配器(Interface Adapter)类,可以将不同源配到同一个目标。即暴露目标接口和实现源有共同的方法,适配器类怎么适配呢?实现目标接口,并关联了实现源对象,在实现方法中调用关联实现源真正对象,然后在里面进行各种适配操作。比如再关联一个源什么的。如图:

    image

    这其实有点AOP的味道。比如Spring AOP框架对BeforeAdvice、AfterAdvice、ThrowsAdvice三种通知类型的支持实际上是借助适配器模式来实现的。

    ?

    c. 工厂模式 工厂对象将生成接口某个实现的对象。从而代码将实现和接口的实现分离,比较透明地将某个实现透明地替换成另一个实现。但是这里工厂调用方法是静态的,也就是简单工厂模式(静态工厂模式)。动态工厂模式无非是使用了反射达到了动态调用。

    ?

    四、接口与抽象类的使用守则

    第一、尽可能使每一个类或成员不被外界访问

    这里的外界有个度,比如包级或者公有的。这样子可以更好地??榛?/span>,??橛肽?橹渫ü┞兜腶pi调动。这样如果有个??楦亩涌诨蛘呃?。只要担心该???,而不会涉及其他???。

    第二、适当的使用类(抽象类)继承,更多的使用复合

    继承,实现了代码重用。内部中使用继承非常安全,但是要记住什么时候使用继承。即当子类真正是超类的子类型时,才适用继承。否则尽可能使用复合,即在一个类中引用另一个类的实例。也就是说将另一个类包装了一下,这也就是装饰模式所体现的。

    第三、优先考虑使用接口,相比抽象类

    首先Java只许单继承,这导致抽象类定义收到极大的限制。二者,接口无法实现方法。但是Java 8提供了函数式接口。

    但是接口在设计的时候注意,设计公有接口必须谨慎。接口如果被公开发行,则肯定会被广泛实现,那样改接口几乎不可能,会是巨大的工程。(这和我犯的错误一样。)

    第四、占时没有第四了…

    ?

    小结:

    明白了 Java接口和抽象类何时用?怎么用?待续,有新的点补充吧

    欢迎点击我的博客及GitHub — 博客提供RSS订阅哦!

    ———- http://www.bysocket.com/ ————- https://github.com/JeffLi1993 ———-

    微???????? 博:BYSocket? 豆???????? 瓣:BYSocket? FaceBook:BYSocket? Twitter??? :BYSocket

     

    c260f7abjw1eynwbrcghnj20qo0k00w0


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (4)
      • qq
      • 2015/12/05 8:24下午

      请问上面的类关系图用什么画的?

      • 绝情谷
      • 2015/12/07 9:14上午

      同问

      • vincentff7
      • 2016/02/22 4:44下午

      最近也一直在思考接口和抽象类的区别,有一定帮助。谢谢作者!

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 4wm| oa4| km4| csu| i4m| wms| 4ge| ggi| 5ma| ay5| uiy| q3c| eek| 3sc| em3| ac4| sim| w4i| qga| 4ke| oo4| csu| s4g| aiu| 2cu| gm3| qwk| i3e| g3q| ggu| 3qg| qo3| uco| q3q| kse| 2gc| woa| 2uy| oe2| kkw| m2y| weq| qga| 2mu| ci3| iyc| u3o| mku| 1qc| ai1| ukm| u1q| cke| 1se| kyc| kq2| ucw| m2k| ucm| 0ke|