1.簡要說明什么是軟件體系結構,軟件體系結構模型,為什么要建立軟件體系結構模型?
答:軟件體系結構指一個軟件系統在高層次上的結構化組織方式,包括系統的組成部分和各個部分之間的關系,以及它們與環境之間的交互,同時它描述了各個組件之間的聯系和功能分配,為系統的設計、維護提供指導和支持。
軟件體系結構模型是描述軟件體系結構的抽象表達,通常以圖形化的方式呈現,用于表達軟件系統整體結構和各個部分之間的關系,包含組件、連接、約束等等。
使用軟件體系結構模型可以使開發人員能夠更好理解整個系統開發的結構和組成,使軟件開發更加有序、高效,有益于軟件的質量和可維護性。
2.簡要說明什么是構件和軟件重用?
答:構件(component):指的是一個系統中的模塊或部件,具有獨立的功能和接口,并且可以通過接口與其他構件進行交互和組合。它是軟件系統的基本構成單位,它可以獨立地進行開發、測試、部署和維護。
軟件重用:將軟件開發過程中完成并通過測試的模塊、組件庫等重復利用的過程。
3.4+1視圖模型中各視圖的作用。?
答:邏輯視圖:描述軟件功能和系統架構的
開發視圖:描述軟件開發過程
過程視圖:描述軟件運行過程(交互、執行)
物理視圖:描述軟件的物理結構和部署方式(硬件環境)
場景視圖:描述軟件的使用場景和使用流程(用戶需求)
4. UML模型圖在軟件體系結構建模中的作用。圖的畫法
答:用例圖:描述用戶的需求和功能
類圖:用于描述軟件的靜態結構
活動圖:描述軟件系統結構的操作流程和業務流程
狀態圖:描述軟件系統中的狀態和狀態轉換
時序圖:用于描述軟件系統中的對象交互和信息傳遞的順序
組件圖:用于描述組件和依賴之間的關系
部署圖:用于描述軟件系統的物理部署結構?
5.簡單工廠模式和工廠方法模式的優缺點。?
模式名稱 優點 缺點
簡單工廠模式 隱藏具體實現、降低客戶端和實現類的耦合度 不易擴展、代碼復雜度高
工廠方法模式 將創建對象交給子類進行,具有可擴展性、降低耦合度、代碼可讀性高 增加代碼復雜度
6.WSDL文檔開發客戶端應用程序的流程。
答: WSDL (Web Server Description Language)
1.獲取WDSL文件: web服務網址+“?WDSL”
2.生成客戶端代碼
3.編寫客戶端代碼
4.部署客戶端應用程序
5.測試
7.二層C/S、三層C/S、B/S,以及C/S與B/S混合架構風格示意圖及其含義。
答:B/S(browser/server): 瀏覽器-服務端架構,由瀏覽器向服務器發送請求,服務器向瀏覽器頁面進行響應。
C/S(client/server): 客戶端-服務端,由客戶端應用向服務器發送網絡請求,有服務端向客戶端應用響應。客戶端通常負責處理用戶界面和輸入數據,而服務器則負責處理應用程序邏輯和數據存儲。
三層C/S,它將應用程序分成三個層次:表示層(Presentation Layer)、應用層(Application Layer)和數據層(Data Layer)。表示層負責處理用戶界面,應用層負責處理應用程序邏輯,數據層負責處理數據存儲和檢索。
B/S、C/S混合架構:指將B/S架構和C/S架構進行結合,通過服務器端的中間件來協調前端瀏覽器和后端應用程序之間的交互。在這種架構中,前端用戶界面仍然是基于瀏覽器的Web應用程序,但是通過中間件與后端服務器進行交互,后端服務器可以提供更多的應用邏輯和數據處理功能。
8.設計模式以及對應的編程
// 產品接口
public interface Product {
void use();}
// 具體產品1
public class ConcreteProduct1 implements Product {
public void use() {
System.out.println(“I am ConcreteProduct1.”); }}
// 具體產品2
public class ConcreteProduct2 implements Product {
public void use() {
System.out.println(“I am ConcreteProduct2.”); }}
// 工廠類
public class Factory {
public static Product createProduct(String type) {
if (“Product1”.equals(type)) {
return new ConcreteProduct1();
} else if (“Product2”.equals(type)) {
return new ConcreteProduct2();
} else {
return null; } }}
// 客戶端
public class Client {
public static void main(String[] args) {
Product product1 = Factory.createProduct(“Product1”);
product1.use();
Product product2 = Factory.createProduct(“Product2”);
product2.use();}]
9.某客戶要求開發一個無人自動售貨機系統,主要需求調研記錄如下:送貨員在每周固定時間查看售貨機中的商品數量和錢幣數量情況,并根據計劃適當添加商品、錢幣或取走適當的錢幣。同時,送貨員也可以根據需要增加商品的種類,或修改商品的價格。售貨時,顧客把錢幣投入機器的投幣口中,機器檢查錢幣的真偽,如果發現假幣機器拒收,并將其從退幣口退出。當機器接收了有效的錢幣之后,將之送入錢幣儲藏器。顧客支付的貨幣根據錢幣的面值進行累加。自動售貨機裝有貨物分配器,每個分配器中包含0個或多個價格相同的貨物。顧客通過選擇貨物分配器來選擇貨物。如果有貨,且顧客支付的貨幣值不小于該貨物的價格,貨物將被分配到貨物傳送孔送給顧客,并將找零返回到退幣口。如果無貨,則和顧客支付的貨幣值相等的錢幣將被送到退幣口。如果顧客支付的貨幣值小于所選貨物的價格,機器將等待顧客投進更多的貨幣。如果顧客決定不買所選擇的貨物,他投放進的錢幣將從退幣口中退出。
請根據以上描述,進行分析設計,完成UML多視圖體系架構建模任務:
為了完成這個無人自動售貨機系統的設計,需要進行多視圖體系架構建模任務。下面將分別從邏輯視圖、進程視圖、物理視圖
1.邏輯視圖 邏輯視圖描述系統的靜態結構和行為。在這個自動售貨機系統中,存在以下類:
?VendingMachine:自動售貨機類,負責售貨、找零等操作。
?Coin:錢幣類,包括面值、數量、真偽等屬性。
?Product:商品類,包括名稱、價格等屬性。
?Dispenser:分配器類,包括存儲的商品、庫存等屬性。
?Refund:退款類,記錄退款的錢幣和數量。
類之間的關系如下:
?VendingMachine和Coin之間是一對多的關系,即一個自動售貨機可以接收多種面值的錢幣。
?VendingMachine和Product之間是多對多的關系,即一個自動售貨機可以有多種商品,一個商品可以被多個自動售貨機售賣。
?VendingMachine和Dispenser之間是一對多的關系,即一個自動售貨機可以有多個分配器,一個分配器只屬于一個自動售貨機。
?VendingMachine和Refund之間是一對多的關系,即一個自動售貨機可以有多個退款記錄,一個退款記錄只屬于一個自動售貨機。
進程視圖 進程視圖描述系統的動態行為。在這個自動售貨機系統中,存在以下進程:
?VendingMachineProcess:自動售貨機進程,負責處理售貨、找零等業務邏輯。
?RefundProcess:退款進程,負責退款操作。
自動售貨機進程接收來自客戶端的請求,包括選擇商品、投入錢幣、查詢庫存等。如果客戶投入的錢幣足夠支付選擇的商品,自動售貨機進程將發起退款進程,完成找零和出貨的操作。如果客戶選擇的商品無貨或投入的錢幣不足,自動售貨機進程將等待客戶繼續投入錢幣或重新選擇商品。
1.物理視圖 物理視圖描述系統的物理組成和部署。在這個自動售貨機系統中,存在以下物理組件:
Client
?VendingMachineDevice:自動售貨機設備,包括貨物分配器、錢幣投入口、退幣口、貨物傳送孔等組件。
?VendingMachineServer:自動售貨機服務器,負責接收客戶端請求并調用自動售貨機進程處理請求。
一.軟件詳細設計
自選一個項目,完成一個模塊的詳細設計,具體包括:
1.描述清楚項目名稱,模塊功能
2.UML類圖
3.正向工程源碼
public class Ability {
String abilityName=null;
public Ability(){}public String getAbilitylName() {return abilityName;}public void setAbilityName(String abilityName) {this.abilityName = abilityName;}
}public class Learn extends Ability{public Learn(String abilityName) {super();this.abilityName = abilityName;}public void JavaClass(){System.out.println(this.abilityName+"我擅長Java語言!");}public void math(){System.out.println(this.abilityName+"我擅長高等數學!");}
}
public class Sports extends Ability{public Sports(String abilityName) {super();this.abilityName = abilityName;}public void run(){System.out.println(this.abilityName+"我擅長長跑!");}public void climb(){System.out.println(this.abilityName+"我擅長攀巖!");}
}public class Main {public static void main(String[] args) {Ability abilityLearn = new Learn("學習能力");Learn learn = (Learn) abilityLearn;learn.JavaClass();learn.math();Ability abilitySports = new Sports("運動能力");Sports sports = (Sports) abilitySports;sports.run();sports.climb();}
}
二.軟件設計模式:單例模式類圖及兩種實現方式源碼(自定義類)
雙重檢查模式DCL:
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){
}
public static Singleton getInstance() {
if (instance== null) {
synchronized (Singleton.class) {
if (instance== null) {
instance= new Singleton(); } } }
return singleton; } }
靜態內部類實現:
public class Singleton {
private Singleton() { }
public static Singleton getInstance() {return SingletonHolder.instance; }/*** 靜態內部類*/
private static class SingletonHolder {private static Singleton instance = new Singleton();
}
}
三.軟件設計模式:簡單工廠模式類圖及源碼
package Operation;
public abstract class Operation {
double numberA=0;
double numberB=0;
public double getNumberA() {
return numberA; }
public void setNumberA(double numberA) {
this.numberA = numberA; }
public double getNumberB() {
return numberB; }
public void setNumberB(double numberB) {
this.numberB = numberB; }
public abstract double operate(); }
加類:
Java代碼
package Operation;
public class Add extends Operation {
@Override
public double operate() {
return numberA+numberB;
}
}
減類:
Java代碼
package Operation;
public class Sub extends Operation {
@Override
public double operate() {
return numberA-numberB; } }
乘類:
Java代碼
package Operation;
public class Mul extends Operation {
@Override
public double operate() {
return numberAnumberB; } }
除類:
Java代碼
package Operation;
import java.io.IOError;
public class Div extends Operation {
@Override
public double operate() {
try {
return numberA/numberB;
} catch (IOError e) {
System.out.println(“除數不能為空!”);
return 0; } } }
工廠類:
Java代碼
import Operation.Add;
import Operation.Div;
import Operation.Mul;
import Operation.Operation;
import Operation.Sub;
public class OperationFactory {
public static Operation createOperation(char operate){
Operation operation=null;
switch (operate) {
case ‘+’:
operation=new Add();
break;
case ‘-’:
operation=new Sub();
break;
case '‘:
operation=new Mul();
break;
case ‘/’:
operation=new Div();
break; }
return operation; } }
客戶端:
Java代碼
import Operation.Operation;
public class Client {
public static void main(String[] args) {
Operation operation = OperationFactory.createOperation(’*');
operation.setNumberA(12);
operation.setNumberB(6);
System.out.println(operation.operate());
}
}
四.設計軟件模式:模板方法模式類圖及源碼
package com.amosli.dp.behavior.template;
public abstract class AbstractClass {
public void templateMethod(){
primitiveMethod1();
primitiveMethod2();}
public abstract void primitiveMethod1();
public abstract void primitiveMethod2();}
package com.amosli.dp.behavior.template;
public class ConcreteClassA extends AbstractClass{
@Override
public void primitiveMethod1() {
System.out.println(“ConcreteClassA primitive method 1…”);}
@Override
public void primitiveMethod2() {
System.out.println(“ConcreteClassA primitive method 2…”);}}
package com.amosli.dp.behavior.template;
public class ConcreteClassB extends AbstractClass{
@Override
public void primitiveMethod1() {
System.out.println(“ConcreteClassB primitive method 1…”);}
@Override
public void primitiveMethod2() {
System.out.println(“ConcreteClassB primitive method 2…”);}}
package com.amosli.dp.behavior.template;
public class Client {
public static void main(String[] args) {
AbstractClass abstractClass = new ConcreteClassA();
abstractClass.templateMethod();
abstractClass = new ConcreteClassB();
abstractClass.templateMethod();}}
五.軟件架構:請闡述分布式服務框架Dubbo,包括:
1)Dubbo是什么
2)Dubbo有什么用
3)為什么使用Dubbo
4)什么時候使用Dubbo
答:1、Dubbo是什么?
Dubbo是阿里巴巴開源的基于 Java 的高性能 RPC 分布式服務框架,現已成為 Apache 基金會孵化項目,是一個分布式服務框架,致力于提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。
2、為什么要用Dubbo?
因為是阿里開源項目,國內很多互聯網公司都在用,已經經過很多線上考驗。內部使用了 Netty、Zookeeper,保證了高性能高可用性。
使用 Dubbo 可以將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,可用于提高業務復用靈活擴展,使前端應用能更快速的響應多變的市場需求。
當網站規模達到了一定的量級的時候,普通的MVC框架已經不能滿足我們的需求,于是分布式的服務框架和流動式的架構就凸顯出來了。
3.有什么用
1.透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵入。
2.軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,降低成本,減少單點。
3. 服務自動注冊與發現,不再需要寫死服務提供方地址,注冊中心基于接口名查詢服務提供者的IP地址,并且能夠平滑添加或刪除服務提供者。
Dubbo的存在簡單來說就是要減小service層的壓力。
4.什么時候使用
當網站變大后,不可避免的需要拆分應用進行服務化,以提高開發效率,調優性能,節省關鍵競爭資源等。
當服務越來越多時,服務的URL地址信息就會爆炸式增長,配置管理變得非常困難,F5硬件負載均衡器的單點壓力也越來越大。
當進一步發展,服務間依賴關系變得錯蹤復雜,甚至分不清哪個應用要在哪個應用之前啟動,架構師都不能完整的描述應用的架構關系。
六.軟件架構:請闡述Redis,包括:
1)Redis是什么
2)Redis有什么用
3)為什么使用Redis
4)什么場景下使用Redis
答:1 redis是什么?
通常而言目前的數據庫分類有幾種,包括 SQL/NSQL,,關系數據庫,鍵值數據庫等等 等,分類的標準也不以,Redis本質上也是一種鍵值數據庫的,但它在保持鍵值數據庫簡單快捷特點的同時,又吸收了部分關系數據庫的優點。從而使它的位置處于關系數據庫和鍵值數 據庫之間。Redis不僅能保存Strings類型的數據,還能保存Lists類型(有序)和Sets類型(無序)的數據,而且還能完成排序(SORT) 等高級功能,在實現INCR,SETNX等功能的時候,保證了其操作的原子性,除此以外,還支持主從復制等功能。
2 Redis有什么用?
通常局限點來說,Redis也以消息隊列的形式存在,作為內嵌的List存在,滿足實時的高并發需求。而通常在一個電商類型的數據處理過程之中,有關商品,熱銷,推薦排序的隊列,通常存放在Redis之中,期間也包擴Storm對于Redis列表的讀取和更新。
3、為什么使用
解決應用服務器的cpu和內存壓力
減少io的讀操作,減輕io的壓力
關系型數據庫的擴展性不強,難以改變表結構
4、什么時候用:
數據高并發的讀寫
海量數據的讀寫
對擴展性要求高的數據
七.軟件架構:請闡述RabbitMQ,包括:
1)RabbitMQ是什么
2)RabbitMQ有什么用
3)為什么使用RabbitMQ
4)什么場景下使用RabbitMQ
答:1.什么是rabbitmq
RabbitMQ是支持持久化消息隊列的消息中間件。應用在上下游的層次級業務邏輯中,上級業務邏輯相當于生產者發布消息,下級業務邏輯相當于消費者接受到消息并且消費消息。
采用AMQP高級消息隊列協議的一種消息隊列技術,最大的特點就是消費并不需要確保提供方存在,實現了服務之間的高度解耦
2.為什么要使用rabbitmq
1.在分布式系統下具備異步,削峰,負載均衡等一系列高級功能;
2.擁有持久化的機制,進程消息,隊列中的信息也可以保存下來。
3.實現消費者和生產者之間的解耦。
4.對于高并發場景下,利用消息隊列可以使得同步訪問變為串行訪問達到一定量的限流,利于數據庫的操作。
5.可以使用消息隊列達到異步下單的效果,排隊中,后臺進行邏輯下單。
3、有什么用:
1.解耦,系統A在代碼中直接調用系統B和系統C的代碼,如果將來D系統接入,系統A還需要修改代碼,過于麻煩!
2.異步,將消息寫入消息隊列,非必要的業務邏輯以異步的方式運行,加快響應速度
3.削峰,并發量大的時候,所有的請求直接懟到數據庫,造成數據庫連接異常
4.什么時候使用rabbitmq的場景
1.服務間異步通信
2.順序消費
3.定時任務
4.請求削峰
八、SpringAOP體現了哪些軟件設計原則,有什么好處
開閉原則、里式替換原則、依賴倒置原則、單一職責原則、接口隔離原則、迪米特原則
Aop優點減少重復代碼,提高開發效率,不修改源碼對已有方法進行增強。
九、Spring中的IOC體現了哪些軟件設計原則?有什么好處
開閉原則、里式替換原則、依賴倒置原則、單一職責原則、接口隔離原則、迪米特原則、合成復用原則、
優點:當下層需要改變時,只要接口及接口功能不變,則上層不需要做任何改變,甚至可以在不改動上層代碼是將下層整個替換掉
簡答題匯總
1、什么是設計模式?設計模式目標是什么?
設計模式是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解,保證代碼可靠性。
2、設計模式中一般都遵循的原則有什么?
開閉原則、根據場景進行設計原則、優先組合原則、包容變化原則
3、“Gang of Four”針對“創建優秀面向對象設計”建議了哪些策略?
針對接口編程、優先使用對象組合而不是類繼承,找到并封裝變化點。
4、面向對象系統中功能復用的兩種最常用技術是什么?
類繼承和對象組合,類繼承允許你根據其他類的實現來定義一個類的實現。父類的內部細節對子類可見。類繼承是在編譯時刻靜態定義的,且可直接使用,類繼承可以較方便地改變被復用的實現。對象組合是類繼承之外的另一種復用選擇。新的更復雜的功能可以通過組裝或組合對象來獲得。對象組合要求被組合的對象具有良好定義的接口。
5、只根據抽象類中定義的接口來操縱對象有什么好處?
1) 客戶無須知道他們使用對象的特定類型,只須對象有客戶所期望的接口。
2) 客戶無須知道他們使用的對象是用什么類來實現的,他們只須知道定義接口的抽象類。
6、在MVC模型中M、V、C分別指什么?簡述它們之間的關系?
M:模型(Model),V:視圖(View),C:控制Controller)。
MVC模式的目的就是實現Web系統的職能分工。
Model層實現系統中的業務邏輯,通常可以用JavaBean或EJB來實現。
View層用于與用戶的交互,通常用JSP來實現。
Controller層是Model與View之間溝通的橋梁,它可以分派用戶的請求并選擇恰當的視圖以用于顯示,同時它也可以解釋用戶的輸入并將它們映射為模型層可執行的操作。
7、什么是開閉原則?
軟件實體應當對擴展開放,對修改關閉,軟件系統中包含的各種組件,例如模塊(Modules)、類(Classes)以及功能(Functions)等,應該在不修改現有代碼的基礎上,引入新功能。開閉原則中“開”,是指對于組件功能的擴展是開放的,是允許對其進行功能擴展的;開閉原則中“閉”,是指對于原有代碼的修改是封閉的,即不應該修改原有的代碼。
8、設計數據庫的系統日志,要考慮使用哪些設計模式?
命令模式,備忘錄模式,外觀模式
9、使用工廠模式的主要原因是什么?
工廠模式定義:提供創建對象的接口。因為工廠模式就相當于創建實例對象的new,我們經常要根據類Class生成實例對象,如A a=new A() 工廠模式也是用來創建實例對象的,所以以后new時就要多個心眼,是否可以考慮使用工廠模式,雖然這樣做,可能多做一些工作,但會給你系統帶來更大的可擴展性和盡量少的修改量。
10、在面向對象設計中,《編譯原理》的有限狀態機可以什么樣解決方案完成?貓大叫一聲,所有的老鼠都開始逃跑,主人被驚醒問:(1)設計可能用到什么設計模式?(2)畫出其類圖。
觀察者模式分析:要有聯動性,老鼠和主人的行為是被動的;考慮可擴展性,貓的叫聲可能引起其他聯動效應。
11、單例模式的兩種實現方法,并說明優缺點?
懶漢式,在類被加載時,唯一的實例已經被創建。這個模式在java中很容易實現,在其他語言中很難。
餓漢式,在類加載的時候不創建單例實體。只有在第一次請求實例的時候創建,并且只在第一次創建后不再創佳該類的實例。
12、什么是對象粒度?
所謂的對象粒度就是對象從抽象到具體的描述的程度。同樣一個系統,同樣的需求。兩個設計師給出兩種設計。兩個設計代碼行數差不多,但是類的數目不同。例如有一個對象,我可以用10行代碼去構造它,我也可以用20行代碼,后者比前者更為精確。
13、MVC模式是個復合模式,請寫出你兩種你所知道的MVC中使用的模式。
觀察者模式:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。
策略模式:定義了算法族,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化獨立于使用算法的客戶。
14、舉例說明,適配器模式和裝配器在Java IO中的應用。
裝飾者模式:在由InputStream,OutputStream,Reader和Writer代表的等級結構內部,有一些流處理器可以對另一些流處理器起到裝飾作用,形成新的,具有改善了的功能的流處理器。裝飾者模式是Java I/O庫的整體設計模式。這樣的一個原則是符合裝飾者模式的。
適配器模式:在由InputStream,OutputStream,Reader和Writer代表的等級結構內部,有一些流處理器是對其它類型的流源的適配。這就是適配器模式的應用,適配器模式應用到了原始流處理器的設計上面,構成了I/O庫所有流處理器的起點。
15、在面向對象程序設計中,常常需要避免過多case語句或者if語句,請給出一種設計模式避免過多的條件分支語句,同時指出這種設計模式如何幫助避免過多的Case語句?
訪問者模式。例如 switch(pt){ case A: break; case B: break; … }
把每個條件作成一個類,比如 A條件 class A { public void accept() {//處理邏輯 } }
然后把每個條件的處理方法都用一個類來管理. public class CommonVisitor{ public void visit(A a){a.accept();}//其他條件的訪問方法 public void visit(B b){ b.accept();}}
main里面就這樣調用就行。public static void main(Stirng args[]){CommonVisitor visitor = new CommonVisitor();//如果是想用A條件,則visitor.visit(new A());} 這樣寫的好處,以后先加條件的話我只需要定義新的條件類就行,還有就是在CommonVisitor添加新條件的訪問方法就行,這樣就很好作到一個條件管理一個邏輯。
應用題匯總
1、公司架構:經理、工程師、技師和后勤人員都是公司的雇員,經理管理工程師、技師和后勤人員。高層經理領導較低級別的經理。典型層次圖如下:可以使用哪種設計模式實現公司的層級關系?并說明為什么? 組合模式,第一,其公司關系架構為樹形結構;第二,其表示了部分-整體關系(自己擴展)
2、認真分析以下類圖
要求:①說明選擇了什么設計模式?②寫出其程序代碼。
解:①本題使用了迭代器模式 ②其參考程序代碼如下所示:
interface Aggregate{
Iterator createIterator();}
interface Iterator{
void first();
void next();
boolean hasNext();
Object currentItem();}
class ConcreteAggregate implements Aggregate{
private Object[] obj={“筷”,“杯”,"鍋”,“碗”,“瓢”,“盆”};
public Iterator createIterator(){
return new ConcreteIterator();}
private class ConcreteIterator implements Iterator{
private int currentIndex=0;
public void first(){
currentIndex=0;}
public void next(){
if(currentIndex < obj.length){
currentIndex++;}}
public boolean hasNext(){
return currentIndex < obj.length;}
public Object currentItem(){
return obj[currentIndex];}}}
class Client{
public static void process(Aggregate a){
Iterator i = a.createIterator();
while(i.hasNext()){
System.out.println(i.currentItem().toString());
i.next();}}
public static void main(String a[]){
Aggregate a = new ConcreteAggregate();
process(a);}}
3、某旅游公司(如:廣之旅)欲利用假期為韶關學院學生開展夏令營活動,幫助大學生同國外大學生交流,根據如下描述選擇合適的設計模式進行設計。1)該公司能幫助學生同國外多個大學生聯系,如:哈佛大學、墨爾本大學;2)公司為每個國外大學分配一名翻譯,如:中英翻譯、中澳翻譯。要求:(1)正確選擇設計模式(2)畫出其類圖(3)正確解釋該類圖中的成員角色
解:
對于描述1可以選擇使用中介者模式,對于描述2可以選擇使用適配器模式,參考類圖如下所示
在類圖中,各類的角色如下:
1)旅游公司:抽象中介者;
2)廣之旅:具體中介者;
3)大學生:抽象同事類;
4)韶關學院學生:是具體同事類,也是目標抽象類;
5)哈佛大學生、墨爾本大學生:是具體同事類,也是適配者類;
6)翻譯1、翻譯2:適配器類。