1. 程式人生 > >設計模式面試題

設計模式面試題

一、你對 MVC 的理解, MVC 有什麼優缺點?結合 Struts ,說明在一個 Web 應用如何去使
用?
答:
MVC 設計模式(應用觀察者模式的框架模式)
M: Model(Business process layer) ,模型,操作資料的業務處理層 , 並獨立於表現層 (Independe nt
of presentation) 。
V: View(Presentation layer) ,檢視,通過客戶端資料型別顯示資料 , 並回顯模型層的執行結果 。
C: Controller(Control layer) ,控制器,也就是檢視層和模型層橋樑,控制資料的流向,接受
檢視層發出的事件,並重繪檢視
MVC 框架的一種實現模型
模型二 (Servlet-centric) :
JSP+Servlet+JavaBean ,以控制為核心, JSP 只負責顯示和收集資料, Sevlet ,連線檢視和模
型,將檢視層資料,傳送給模型層, JavaBean ,分為業務類和資料實體,業務類處理業務 數
據,資料實體,承載資料,基本上大多數的專案都是使用這種 MVC 的實現模式。
StrutsMVC 框架 (Web application frameworks)
Struts 是使用 MVC 的實現模式二來實現的,也就是以控制器為核心。
Struts 提供了一些元件使用 MVC 開發應用程式:
Model : Struts 沒有提供 model 類。這個商業邏輯必須由 Web 應用程式的開發者以 JavaBea n
或 EJB 的形式提供
View : Struts 提供了 action form 建立 form bean, 用於在 controlle r 和 view 間傳輸資料。此 外 ,
Struts 提供了自定義 JSP 標籤庫,輔助開發者用 JSP 建立互動式的以表單為基礎的應用程 序 ,
應用程式資原始檔保留了一些文字常量和錯誤訊息,可轉變為其它語言,可用於 JSP 中。
Controller : Struts 提供了一個核心的控制器 ActionServlet ,通過這個核心的控制器來呼叫其
他使用者註冊了的自定義的控制器 Action ,自定義 Action 需要符合 Struts 的自定義 Action 規
範,還需要在 struts-config.xml 的特定配置檔案中進行配置,接收 JSP 輸入欄位形成 Action
form ,然後呼叫一個 Action 控制器。 Action 控制器中提供了 model 的邏輯介面。
二、什麼是 WebService ?
答:
WebService 是一個 SOA (面向服務的程式設計)的架構,它是不依賴於語言,不依賴於平
臺,可以實現不同的語言間的相互呼叫,通過 Internet 進行基於 Http 協議的網路應用間的 交
互。
WebService 實現不同語言間的呼叫,是依託於一個標準, webservice 是需要遵守 WSD L
( web 服務定義語言) /SOAP (簡單請求協議)規範的。
WebService=WSDL+SOAP+UDDI ( webservice 的註冊)
Soap 是由 Soap 的 part 和 0 個或多個附件組成,一般只有 part ,在 part 中有 Envelope 和
Body 。
Web Service 是通過提供標準的協議和介面,可以讓不同的程式整合的一種 SOA 架構。第 2 頁 共 10 頁
Web Service 的優點
(1) 可以讓異構的程式相互訪問(跨平臺)
(2) 鬆耦合
(3) 基於標準協議(通用語言,允許其他程式訪問)
Web Service 的基本原理
(1) Service Provide r 採用 WSDL 描述服務
(2) Service Provider 採用 UDDI 將服務的描述檔案釋出到 UDDI 伺服器( Register server )
(3) Service Requestor 在 UDDI 伺服器上查詢並 獲取 WSDL 檔案
(4) Service requestor 將請求繫結到 SOAP ,並訪問相應的服務。
三、什麼是中介軟體?
中介軟體就是程式中可織入的,可重用的,與業務邏輯無關的各種元件。
中介軟體( middleware )是基礎軟體的一大類,屬於可複用軟體的範疇。顧名思義,中 間
件處於作業系統軟體與使用者的應用軟體的中間。中介軟體在作業系統、網路和資料庫之上, 應
用軟體的下層,總的作用是為處於自己上層的應用軟體提供執行與開發的環境,幫助使用者 靈
活、高效地開發和整合複雜的應用軟體。
在眾多關於中介軟體的定義中,比較普遍被接受的是 IDC 表述的:中介軟體是一種獨立的
系統軟體或服務程式,分散式應用軟體藉助這種軟體在不同的技術之間共享資源,中介軟體 位
於客戶機伺服器的作業系統之上,管理計算資源和網路通訊。
分類:資料訪問中介軟體,遠端呼叫中介軟體,訊息中介軟體,交易中介軟體,物件中介軟體。
舉例:
1 , RMI ( Remote Method Invocations, 遠端呼叫)
2 , Load Balancing( 負載均衡,將訪問負荷分散到各個伺服器中 )
3 , Transparent Fail-over( 透明的故障切換 )
4 , Clustering( 叢集 , 用多個小的伺服器代替大型機)
5 , Back-end-Integration( 後端整合,用現有的、新開發的系統如何去整合遺留的系統 )
6 , T ransaction 事務(全域性 / 區域性)全域性事務(分散式事務)區域性事務(在同一資料庫聯 接
內的事務)
7 , Dynamic Redeployment ( 動態重新部署 , 在不停止原系統的情況下,部署新的系統)
8 , System Management( 系統管理 )
9 , Threading( 多執行緒處理 )
10 , Message-oriented Middleware 面向訊息的中介軟體(非同步的呼叫程式設計)
11 , Component Life Cycle( 元件的生命週期管理 )
12 , Resource pooling (資源池)
13 , Security (安全)
14 , Caching (快取)
四、什麼是典型的軟體三層結構?軟體設計為什麼要分層?軟體分層有什麼好處?
答: (1) Presentation layer (表示層)
(1) 表示邏輯(生成介面程式碼)
(2) 接收請求
(3) 處理業務層丟擲的異常
(4) 負責規則驗證(資料格式,資料非空等)
(5) 流程控制第 3 頁 共 10 頁
(2) Service layer (服務層 / 業務層)
(1) 封裝業務邏輯處理,並且對外暴露介面
(2) 負責事務,安全等服務
(3) Persistence layer (持久層)
(1) 封裝資料訪問的邏輯,暴露介面
(2) 提供方便的資料訪問的方案(查詢語言, API ,對映機制等)
Domain layer (域層)
(1) 業務物件以及業務關係的表示
(2) 處理簡單的業務邏輯
(3) 域層的物件可以穿越表示層,業務層,持久層
軟體分層結構使得程式碼維護非常方便,設計明確,各層獨立,專注自己擅長的領域。
五、什麼是 OOP ? OOP 相對於面向過程程式設計有哪些優點?
OOP , Object-Oriented Programming ,面向物件程式設計不同於面向過程程式設計:
( 1 ) OOP 關注物件和角色,也就是事物的本質
1 ) OOP 把客觀世界中的物件抽象成對應的類;
2 )通過類構造例項;
3 )通過依賴、繼承、實現等形式建立物件間的通訊關係
( 2 ) OOP 易於擴充套件,增加或改變業務的功能,無需大幅改動改變原始碼
( 3 ) OOP 易於建模, OOP 就是軟體架構師在計算機高階語言中對客觀世界的抽象和
再現,人們可以很好地理解和建立起計算機中的抽象模型
六、談談 Overload 和 Override 的區別。
答:
方法的重寫 Overriding 和過載 Overloading 是 Java 多型性的不同表現。重寫 Overriding
是父類與子類之間多型性的一種表現,過載 Overloading 是一個類中多型性的一種表現。如
果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫 (Overriding) 。 子
類的物件使用這個方法時,將呼叫子類中的定義,對它而言,父類中的定義如同被 “ 遮蔽 ”
了。如果在一個類中定義了多個同名的方法,它們或有不同的引數個數或有不同的引數類 型 ,
則稱為方法的過載 (Overloading) 。 O verloaded 的方法是可以改變返回值的型別。
七、談談 HashMap 和 Hashtable 的區別。
答: HashMap 是輕量級的(執行緒不安全的,效率高的)集合, Hashtable 是重量級的(線
程安全的,效率低的)集合。
都屬於 Map 介面的類,實現了將惟一鍵對映到特定的值上。
HashMap 類沒有分類或者排序。它允許一個 null 鍵和多個 null 值。
Hashtable 類似於 HashMap ,但是不允許 null 鍵和 null 值。它也比 HashMap 慢 ,
因為它是同步的。
八、請問 abstract class 和 interface 有什麼區別?
答:
1) 介面沒有任何的實現 , 而抽象類它可以有部分的實現也可以沒有 ;
2) 如果需要複用或者共享部分程式碼 , 應該用抽象類而不是介面 ;
3) 繼承無法解決型別的轉換問題 , 介面就是為了解決這一問題而產生的 (Java 的單繼第 4 頁 共 10 頁
承是介面產生的根本原因 ) 介面是一種抽象的第三方規範 , 跟物件沒什麼直接關係。
九、請問軟體開發中的設計模式你會使用哪些?
答:我熟悉的設計模式有單例模式, DAO 模式,模板方法,工廠模式,委託代理模式, M VC
模式等。
Singleton 模式主要作用是保證在 Java 應用程式中,一個類 Class 只有一個例項存在。
Singleton 模式一般形式 :
定義一個類,它的建構函式為 private 的,它有一個 static 的 private 的該類變數,在 類
初始化時例項話,通過一個 public 的 getInstance 方法獲取對它的引用 , 繼而呼叫其中的方法 。
十、類的核心特性有哪些?
類具有封裝性、繼承性和多型性。
封裝性:
類的封裝性為類的成員提供公有、預設、保護和私有等多級訪問許可權,目的是隱藏類 中
的私有變數和類中方法的實現細節。
繼承性:
類的繼承性提供從已存在的類建立新類的機制,繼承( inher itance )使一個新類自動擁
有被繼承類(父類)的全部成員。
多型性:
類的多型性提供類中方法執行的多樣性,多型性有兩種表現形式:過載和覆蓋。
十一、請問類與物件有什麼區別?

類就是某一種事物的一般性的集合體,是相同或相似的各個事物共同特性的一種抽象。
物件
在面向物件概念中,物件( Object )是類的例項( instance )。物件與類的關係就像變數
與資料型別的關係一樣。
十二、寫出生產者消費者模型的實現(參照 OOA/D 中老師的程式碼)
十三、用軟體工程和 Java 來敘述購物車( shopping cart )系統實現
十四、檔案系統的幾個類 :FileInputStream 、 FileOutputStream 、 FileReader 、 FileWriter 的區 別
十五、請寫出 Java API 中最常用的五個包,並且各舉兩個類加以說明。 ( 查閱 api)
十六、請問你在 “ 電信運營支撐系統 ” 中遇到了哪些問題?你是怎麼解決的?做這個專案 你
最大的收穫是什麼? ( 自己結合自己的專案 , 做一下總結 , 然後想想怎麼去回答 )
十七、請說出幾個常用的異常類
答: NullpointException (空指標異常)
ClassNotFoundException (類找不到異常)
ClassCastException (型別轉換異常)
IllegalArgumentException (非法引數異常)
ArithmeticException (算術異常)
NumberFormatException (資料格式異常)
IndexOutOfBoundsException (陣列下標越界異常)
IllegalStateException (非法語句異常)
十八、什麼是程序和執行緒?兩者的區別是什麼? ( 經常會被問道 , 查閱作業系統書 , 或問問陳 老
師 )
十九、請簡要描述一下你做的 ShoppingCar t 專案。 ( 自己結合自己的專案 , 做一下總結 , 然後 想第 5 頁 共 10 頁
想怎麼去回答 )
二十、請問網路 7 層協議, tcp/ip4 層協議是什麼?
二十一、 Java 面向物件的四大特點
二十二、 public, private, protected , default 訪問許可權(可見性)
答:
public :全域性可見
protected :繼承體系結構之間可見
default (或不寫):同包可見
private :本類可見。
二十三、名詞解釋
CRM
[Customer Relationship Management, 客戶關係管理 ]
ERP
[Enterprise Resource Planning, 企業資源規劃 ]
OSS
[Operation Support System, 運營支撐系統 ]
BSS
[Business Support System, 資料定義語言 ]
BOSS
[Business Operation Support System, 資料定義語言 ]
OA
[Office Automatizat ion, 辦公自動化 ]
HTTP
OOP
SOA
GUI
DDL
[Data Definit ion Language, 資料定義語言 ]
DML
[Data Manipulat ion Language, 資料操作語言 ]
WYSIWYG
所見即所得 [What You See is What You Get]
CMP
CMT
B2B
C2C
B2C
IDE
DOM
Client/Server
CMM
ORM
MIS
MVC第 6 頁 共 10 頁
MVC 是 Model - View - Controller 的簡寫。 "Model" 代表的是應用的業務邏輯(通過
JavaBean , EJB 元件實現), "View" 是應用的表示面(由 JSP 頁面產生), "Controller" 是
提供應用的處理過程控制(一般是一個 Servlet ),通過這種設計模型把應用邏輯,處理過 程
和顯示邏輯分成不同的元件實現。這些元件可以進行互動和重用。
OLE
CORBA
CORBA 標準是公共物件請求代理結構 (Common Object Request Broker Architecture) ,由 對
象管理組織 (Object Management Group ,縮寫為 OMG) 標準化。它的組成是介面定義語言
(IDL), 語言繫結 (binding: 也譯為聯編 ) 和允許應用程式間互操作的協議。 其目的為:
用不同的程式設計語言書寫
在不同的程序中執行
為不同的作業系統開發。
UML
UML ,標準建模語言,包含用例圖 , 靜態圖 ( 包括類圖、物件圖和包圖 ), 行為圖 , 互動圖 ( 順 序
圖 , 合作圖 ), 實現圖等。
XML
CMMI
JRE
J2EE
J2EE 是 Sun 公司提出的多層 (multi-diered), 分散式 (distributed), 基於元件 (component-base )
的企業級應用模型 (enterpriese application model). 在這樣的一個應用系統中,可按照功能劃 分
為不同的元件,這些元件又可在不同計算機上,並且處於相應的層次 (tier) 中。所屬層次包 括
客戶層 (clietn tier) 元件 ,web 層和元件 ,Business 層和元件 , 企業資訊系統 (EIS) 層。
JDK
AOP
OO
Container
W3C
JMS
Domain
POJO
JVM
JNDI
JTA
SOAP
[Simple Object Access Protocol ,簡單物件訪問協議 ]
WSDL
JDO
JDO 是 Java 物件持久化的新的規範,為 Java Data Object 的簡稱 , 也是一個用於存取某種 數
據倉庫中的物件的標準化 API 。 JDO 提供了透明的物件儲存,因此對開發人員來說,儲存 數
據物件完全不需要額外的程式碼(如 JDBC API 的使用)。這些繁瑣的例行工作已經轉移到 J DO
產品提供商身上,使開發人員解脫出來,從而集中時間和精力在業務邏輯上。另外, JDO
很靈活,因為它可以在任何資料底層上執行。 JDBC 只是面向關係資料庫( RDBMS)JDO 更
通用,提供到任何資料底層的儲存功能,比如關係資料庫、檔案、 XM L 以及物件資料庫第 7 頁 共 10 頁
( ODBMS )等等,使得應用可移植性更強。
TDD
DAO
IoC
[Inversion of Control, 控制反轉 ]
RMI
DNS
[Internet Domain Name System, 因特網域名系統 ]
URL
URI
二十四、資料庫連線池的工作機制
二十五、網際網路提供哪些服務?
二十六、請寫出 JSP 的幾個隱含內建物件
答: JSP 中隱含內建物件
名稱 型別 註釋和範圍
request javax.servlet.http.HttpServletRequest request
response javax.servlet.http.HttpServletResponse response
page javax.lang.Object page
Exception java.lang.Throwable page
pageContext javax.servlet.jsp.PageContext page
session javax.servlet.http.HttpSession session
application javax.servlet.ServletContext ServletContext
out javax.servlet.jsp.JspWriter O utput S tream
config javax.servlet.ServletConf ig ServletConf ig
JSP 共有以下 9 種基本內建元件(可與 ASP 的 6 種內部元件相對應):
request 使用者端請求,此請求會包含來自 GET/POST 請求的引數
response 網頁傳回使用者端的迴應
page JSP 網頁本身
exception 針對錯誤網頁,未捕捉的例外
pageContext 網頁的屬性是在這裡管理
session 與請求有關的會話期
application servlet 正在執行的內容
out 用來傳送回應的輸出
config Servlet 的構架部件
二十七、請你談談 SSH 整合
答: SSH :
Struts (表示層) +Spring (業務層) +Hibernate (持久層)
Struts :
Struts 是一個表示層框架,主要作用是介面展示,接收請求,分發請求。
在 MVC 框架中, Struts 屬於 VC 層次,負責介面表現,負責 MVC 關係的分發。( Vie w :
沿用 JSP , HTTP , Form , Tag , Resourse ; Controller : ActionServlet , struts-config.xml , A ction )
Hibernate :第 8 頁 共 10 頁
Hibernate 是一個持久層框架,它只負責與關係資料庫的操作。
Spring :
Spring 是一個業務層框架,是一個整合的框架,能夠很好地黏合表示層與持久層。
二十八、 應用伺服器與 Web Server 的區別
二十九、 Java Servlet API 中 forward() 與 redirect() 的區別
答:
前者僅是容器中控制權的轉向,在客戶端瀏覽器位址列中不會顯示出轉向後的地址; 後
者則是完全的跳轉,瀏覽器將會得到跳轉的地址,並重新發送請求連結。這樣,從瀏覽器 的
位址列中可以看到跳轉後的連結地址。所以,前者更加高效,在前者可以滿足需要時,盡 量
使用 forward() 方法,並且,這樣也有助於隱藏實際的連結。在有些情況下,比如,需要跳
轉到一個其它伺服器上的資源,則必須使用 sendRedirect() 方法。
三十、寫一個簡單的 C/S 結構程式, Java 的通訊程式設計,程式設計題 ( 或問答 ) ,用 JAVA SOCKET
程式設計,讀伺服器幾個字元,再寫入本地顯示?
答 :Server 端程式 :
package test;
import java.net.*;
import java.io.*;
public class Server
{
private ServerSocket ss;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public Server()
{
try
{
ss=new ServerSocket(10000);
while(true)
{
socket = ss.accept();
String RemoteIP = socket.getInetAddress().getHostAddress();
String RemotePort = ":"+socket.getLocalPort();
System.out.println("A client come in!IP:"+RemoteIP+RemotePort);
in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
String line = in.readLine();
System.out.println("Cleint send is :" + line);
out = new PrintWriter(socket.getOutputStream(),true);
out.println("Your Message Received!");
out.close();
in.close();第 9 頁 共 10 頁
socket.close();
}
}catch (IOException e)
{
out.println("wrong");
}
}
public static void main(String[] args)
{
new Server();
}
};
Client 端程式 :
package test;
import java.io.*;
import java.net.*;
public class Client
{
Socket socket;
BufferedReader in;
PrintWriter out;
public Client()
{
try
{
System.out.println("Try to Connect to 127.0.0.1:10000");
socket = new Socket("127.0.0.1",10000);
System.out.println("The Server Connected!");
System.out.println("Please enter some Character:");
BufferedReader line = new BufferedReader(new
InputStreamReader(System.in));
out = new PrintWriter(socket.getOutputStream(),true);
out.println(line.readLine());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(in.readLine());
out.close();
in.close();
socket.close();
}catch(IOException e)
{
out.println("Wrong");
}
}第 10 頁 共 10 頁
public static void main(String[] args)
{
new Client();
}
};
三十一、請問軟體開發中的設計模式你會使用哪些?
答:我熟悉的設計模式有單例模式, DAO 模式,模板方法,工廠模式,委託代理模式, M VC
模式等。
Singleton 模式主要作用是保證在 Java 應用程式中,一個類 Class 只有一個例項存在。
Singleton 模式一般形式 :
定義一個類,它的建構函式為 private 的,它有一個 static 的 private 的該類變數,在 類
初始化時例項話,通過一個 public 的 getInstance 方法獲取對它的引用 , 繼而呼叫其中的方法 。
三十二、類的核心特性有哪些?
類具有封裝性、繼承性和多型性。
封裝性:
類的封裝性為類的成員提供公有、預設、保護和私有等多級訪問許可權,目的是隱藏類 中
的私有變數和類中方法的實現細節。
繼承性:
類的繼承性提供從已存在的類建立新類的機制,繼承( inher itance )使一個新類自動擁
有被繼承類(父類)的全部成員。
多型性:
類的多型性提供類中方法執行的多樣性,多型性有兩種表現形式:過載和覆蓋。
三十三、請問類與物件有什麼區別?
類 : 類就是某一種事物的一般性的集合體,是相同或相似的各個事物共同特性的一種 抽
象。
物件 : 在面向物件概念中,物件( Object )是類的例項( instance )。物件與類的關係 就
像變數與資料型別的關係一樣。