java 外部接口調用 設計模式_《Java設計模式》之接口模式

-----------模式是思想的體現,而非具體的實現。

抽象的講,類的接口是類允許其他類對象訪問的方法與字段集。接口通常代表一種承諾,即方法需要實現接口方法名表示的操作,遵循代碼注釋和其他文檔說明,類的實現就是方法體中的代碼。

java不允許多重繼承,也就是說一個子類只能有一個父類,Son extends FatherA,FatherB 是錯誤的為了彌補這點不足,java允許實現多個接口, 接口就是給出一些沒有內容的方法,類似于C++中的虛類。到具體用的時候再由用的方法自己定義內容,要注意的是想用接口必須實現接口的所有方法。

其實是因為java不支持多繼承才產生了接口,接口是用來規范類的它可以避免類在設計上的不一致,這在多人合作的開發中猶為重要,就比如接口中有A方法,那么實現這個接口就必須實現A方法,這就形成了一種規范,也就是說,A繼承了B,但卻想使用C的一個方法,但又不能再繼承,所以就使用了C的接口。

Java接口和Java抽象類代表的就是抽象類型,就是我們需要提出的抽象層的具體表現。OOP面向對象的編程,如果要提高程序的復用率,增加程序的可維護性,可擴展性,就必須是面向接口的編程,面向抽象的編程,正確地使用接口、抽象類這些太有用的抽象類型做為你結構層次上的頂層。

=============================================================================================

Java接口和Java抽象類有太多相似的地方,又有太多特別的地方,究竟在什么地方,才是它們的最佳位置呢?把它們比較一下,你就可以發現了。

1、Java接口和Java抽象類最大的一個區別,就在于Java抽象類可以提供某些方法的部分實現,而Java接口不可以,這大概就是Java抽象類唯一的優點吧,但這個優點非常有用。如果向一個抽象類里加入一個新的具體方時,那么它所有的子類都一下子都得到了這個新方法,而Java接口做不到這一點,如果向一個Java接口里加入一個新方法,所有實現這個接口的類就無法成功通過編譯了,因為你必須讓每一個類都再實現這個方法才行,這顯然是Java接口的缺點。

2、一個抽象類的實現只能由這個抽象類的子類給出,也就是說,這個實現類處在抽象類所定義出的繼承的等級結構中,而由于Java語言的單繼承性,所以抽象類作為類型定義工具的效能大打折扣。在這一點上,Java接口的優勢就出來了,

任何一個實現了一個Java接口所規定的方法的類都可以具有這個接口的類型,而一個類可以實現任意多個Java接口,從而這個類就有了多種類型。

3、從第2點不難看出,Java接口是定義混合類型的理想工具,混合類表明一個類不僅僅具有某個主類型的行為,而且具有其他的次要行為。

4、結合1、2點中抽象類和Java接口的各自優勢,

最精典的設計模式就出來了:聲明類型的工作仍然由Java接口承擔,但是同時給出一個Java抽象類,且實現了這個接口,而其他同屬于這個抽象類型的具體類可以選擇實現這個Java接口,也可以選擇繼承這個抽象類,也就是說在層次結構中,Java接口在最上面,然后緊跟著抽象類,哈,這下兩個的最大優點都能發揮到極至了。這個模式就是“缺省適配模式”。

在Java語言API中用了這種模式,而且全都遵循一定的命名規范:Abstract +接口名。Java接口和Java抽象類的存在就是為了用于具體類的實現和繼承的,如果你準備寫一個具體類去繼承另一個具體類的話,那你的設計就有很大問題了。Java抽象類就是為了繼承而存在的,它的抽象方法就是為了強制子類必須去實現的。使用Java接口和抽象Java類進行變量的類型聲明、參數是類型聲明、方法的返還類型說明,以及數據類型的轉換等。而不要用具體Java類進行變量的類型聲明、參數是類型聲明、方法的返還類型說明,以及數據類型的轉換等。

我想,如果你編的代碼里面連一個接口和抽象類都沒有的話,也許我可以說你根本沒有用到任何設計模式,任何一個設計模式都是和抽象分不開的,而抽象與Java接口和抽象Java類又是分不開的。

java將接口概念提升為獨立的結構,體現了接口(對象必須遵循的承諾)與實現(對象如何履行承諾)的分離。java接口允許多個類提供相同的功能,也允許一個類同時實現多個接口。

java中抽象類與接口的區別:

1.一個類可以實現多個接口,但卻只能繼承最多一個抽象類。

2.抽象類可以包含具體方法,接口的所有方法都是抽象的。

3.抽象類中可以聲明和使用字段,接口則不能能,但可以創建靜態的final常量。

4.抽象類中的方法可以是public、protected、private或者默認的package,接口的方法都是public.

5.抽象類可以定義構造函數,接口不能。

java接口的優勢在于它限制了對象之間的協作,這種約束其實提供了更大的自由。即使實現接口的類的實現發生了巨大變化,接口的客戶端仍然可以不受影響。

小結:

接口的威力在于它描述了在類協作中它所期望與不期望的行為。接口與抽象類很相似,定義行為卻并不提供實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393265.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393265.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393265.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BFS(廣度優先搜索)

Catch That Cow Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer …

leetcode111. 二叉樹的最小深度(隊列)

給定一個二叉樹,找出其最小深度。最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。說明: 葉子節點是指沒有子節點的節點。示例:給定二叉樹 [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回它的最小深度 2.代碼 /*** Definition for a binary tree no…

企業網站6個常見的優化漏洞

導讀:企業做營銷網站目的,就是希望通過網絡營銷,挖掘目標客戶。目標客戶怎么來,那就需要通過網站優化,把網站關鍵詞優化排名到首頁,這樣才能更多的機會被潛在客戶點擊。很多企業網站上線之前,沒…

aspx 微型_最初的十億分鐘:正在向世界授課的微型非營利組織背后的數字

aspx 微型by Quincy Larson昆西拉爾森(Quincy Larson) 最初的十億分鐘:正在向世界授課的微型非營利組織背后的數字 (The First Billion Minutes: The Numbers Behind the Tiny Nonprofit That’s Teaching the World to Code) People have now spent more than 1 b…

[RN] React Native 自定義導航欄隨滾動漸變

React Native 自定義導航欄隨滾動漸變 實現效果預覽: 代碼實現: 1、定義導航欄 NavPage.js import React, {Component} from react; import {View, Text, Image, StyleSheet, TouchableOpacity, Platform, Dimensions} from react-native;/*** 自定義導航…

【CSS 技能提升】 :before和:after的使用

前幾天的晚上較全面的去看了下css的一些文檔和資料,大部分的樣式運用都沒什么大問題了,只是有些許較陌生,但是也知道他們的存在和實現的是什么樣式。今天主要想在這篇學習筆記中寫的也不多,主要是針對:before和:after寫一些內容&a…

c語言模擬java面向對象_純c語言實現面向對象分析與示例分享

#include #include //接口#ifndef Interface#define Interface struct#endif//類#ifndef Class#define Class struct#endif//抽象形狀類Class Shape;typedef Class Shape shape;//抽象形狀類的方法聲明shape* Shape(int edges);int shape_getEdges(shape *);int shape_getArea(…

leetcode152. 乘積最大子數組

給你一個整數數組 nums ,請你找出數組中乘積最大的連續子數組(該子數組中至少包含一個數字),并返回該子數組所對應的乘積。 示例 1: 輸入: [2,3,-2,4] 輸出: 6 解釋: 子數組 [2,3] 有最大乘積 6。 代碼 class Solution {publi…

成功試驗基于C#/.NET的Android開發

今天最開心事情莫過于摸索驗證了一個事情,C#也能進行Android和IOS開發,白天安裝了開發環境,晚上進行測試,直到此時此刻,已經成功的導出一款基于C#/.NET的安卓APK,并且能夠成功的導入到安卓手機運行&#xf…

使用機器學習預測天氣_如何使用機器學習根據文章標題預測喜歡和分享

使用機器學習預測天氣by Flavio H. FreitasFlavio H.Freitas著 如何使用機器學習根據文章標題預測喜歡和分享 (How to predict likes and shares based on your article’s title using Machine Learning) Choosing a good title for an article is an important step in the …

深入理解了MySQL,你才能說熟悉數據庫

先拋出幾個問題 1.為什么不建議使用訂單號作為主鍵?2.為什么要在需要排序的字段上加索引?3.for update 的記錄不存在會導致鎖住全表?4.redolog 和 binlog 有什么區別?5.MySQL 如何回滾一條 sql ?6.char(50) 和 varchar(50) 效果是一樣的么?索引知識回顧 對于 MySQL 數據庫…

ibatis mysql 自增_mybatis自增主鍵

簡單介紹:在使用mybats插入數據是,有很多需要和id關聯的其他數據,所以在插入一條信息時獲取其主鍵信息是很常見的操作。一 mysql數據庫的主鍵自增(int類型的主鍵)1 創建一個表,設置表的id(此id必須是int類型),設置為au…

DataGridView控件用法二:常用屬性

通常會設置的DataGridView的屬性如下: AllowUserToAddRows - False指示是否向用戶顯示用于添加行的選項,列標題下面的一行空行將消失。一般讓其消失。AllowUserToDeleteRows - False指示是否允許用戶從DataGridView刪除行。一般不允許。AllowUserToOrder…

leetcode面試題 16.21. 交換和(二分查找)

給定兩個整數數組,請交換一對數值(每個數組中取一個數值),使得兩個數組所有元素的和相等。 返回一個數組,第一個元素是第一個數組中要交換的元素,第二個元素是第二個數組中要交換的元素。若有多個答案&…

談談IP和MAC捆綁的破解之道

來源:[url]http://l-y.vicp.net[/url]我們學校最近將MAC和IP進行了捆綁,又在服務器(2K)上進行了上網時間的限制,真是煩死人了,我想我可是一個從不受限制的人啊,怎么可以就這樣束手就擒呢!古話說…

如何在JavaScript中區分深層副本和淺層副本

by Lukas Gisder-Dub盧卡斯吉斯杜比(LukasGisder-Dub) 如何在JavaScript中區分深層副本和淺層副本 (How to differentiate between deep and shallow copies in JavaScript) New is always better!新總是更好! You have most certainly dealt with copies in Java…

網站QQ全屏PHP代碼,QQ技術導航升級版 超級導航美化版帶后臺版 PHP源碼

QQ技術導航升級版 超級導航美化版帶后臺版改進F2樣式,主針對QQ教程網、卡盟、博客、提供更好收錄的位置。改進QQ技術導航背景,增加整體美觀效果。去掉死鏈頁面,站長操作使用更加有擴大空間。優化后臺登陸界面,去掉織夢后臺攜帶的廣…

MySQL基礎操作(一)

MySQL操作 一、創建數據庫 # utf-8 CREATE DATABASE 數據庫名稱 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;# gbk CREATE DATABASE 數據庫名稱 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; 二、用戶管理 創建用戶create user 用戶名IP地址 identified by 密碼; 刪…

集合框架05

一、HashSet集合 1 public class Demo01 {2 /*3 * Set接口,特點不重復元素,沒索引4 * Set接口的實現類,HashSet(哈希表)5 * 特點:無序集合,存儲和取出的順序不同,沒有索引,不…

leetcode1233. 刪除子文件夾

你是一位系統管理員,手里有一份文件夾列表 folder,你的任務是要刪除該列表中的所有 子文件夾,并以 任意順序 返回剩下的文件夾。 我們這樣定義「子文件夾」: 如果文件夾 folder[i] 位于另一個文件夾 folder[j] 下,那…