開課實驗室: 開課時間: 2016年**月**日 實驗報告: 年 月 日
學院名稱 |
|
年級、專業、班 |
|
學號 |
|
姓名 |
|
同組姓名 |
|
|||
課程名稱 |
軟件架構 |
實驗項目名稱 |
實驗二 適配器模式和橋接模式設計實驗 |
指導教師 |
|
|||||||
實驗類型 |
驗證 √ 綜合 □ 設計 □ 創新 □ |
成績 |
|
|||||||||
教師評語 |
教師簽名: 年 月 日 |
|||||||||||
一、實驗目的
通過本實驗的學習,了解軟件體系結構與軟件體系設計的基本思想,掌握工廠方法、抽象工廠模式等軟件體系結構的設計與實現方法,利用Rose軟件繪制軟件體系的靜態結構圖,並利用面向對象的程序設計語言模擬實現工廠方法、抽象工廠模式,為今后軟件開發與設計的學習奠定基礎。
二、實驗環境
實驗儀器為PC機一台,安裝StarUML軟件和MyEclipse軟件。
三、實驗內容
1、熟悉StarUML軟件的界面和基本操作。
2、掌握StarUML軟件的基本使用方法,能夠運用StarUML軟件繪制適配器模式、橋接模式的UML類圖和模式結構圖。
3、學習利用java語言實現代理適配器模式、橋接模式,並確保代碼運行正確無誤。
四、實驗步驟
1、熟悉StarUML的常用功能。
2、使用StarUML繪制類圖;
3、適配器模式設計與實現:“一個軟件團隊開發繪圖系統,設計了圓對象(Circle)、矩形對象(Rectangle),線對象(Line)都支持Draw()函數,即可以通過Draw()函數繪制圖形。為了加快項目進度,將角度對象(Angle)繪制功能交給了合作團隊實現。但合作團隊將角度對象繪制函數定為了DrawAngle()。繪圖系統提供給用戶后,用戶不滿意,希望能統一的調用,不用記太多命令。”使用StarUML繪制適配器模式結構圖,並運用面向對象編程語言實現該模式。
4、橋接模式設計與實現:“一個咖啡店可以提供大杯(JorumCoffee)、中杯(MediumCoffee)、小杯(SmallCoffee)的咖啡(Coffee),為了滿足不同用戶的口味,在咖啡中可以添加牛奶(Milk),或者糖(Sugar),或者檸檬(Lemon),提供給用戶不同口味的組合,如大杯咖啡加牛奶,中杯咖啡加糖,小杯咖啡加檸檬,小杯咖啡加糖等。”使用橋接模式設計該系統並繪制相應的類圖,並用面向對象編程語言實現該模式。
適配器模式設計與實現:
package Adapter;
public interface Draw {
void Draw();
}
package Adapter;
public class Circle implements Draw {
public void Draw() {
System.out.println("Draw a Circle");
}
}
package Adapter;
public class Line implements Draw {
public void Draw() {
System.out.println("Draw a Line");
}
}
package Adapter;
public class Angle {
public void DrawAngle(){
System.out.println("Draw a Angle");
}
}
package Adapter;
public class AngleAdapter implements Draw {
private Angle angle;
public AngleAdapter(Angle a)
{
this.angle = a;
}
public void Draw() {
angle.DrawAngle();
}
}
package Adapter;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Rectangle rec = new Rectangle();
Circle cir = new Circle();
Line lin = new Line();
Angle an = new Angle();
rec.Draw();
cir.Draw();
lin.Draw();
AngleAdapter ad = new AngleAdapter(an);
ad.Draw();
}
}
運行結果:
橋接模式模式設計與實現:
package Bridge;
public class Coffee {
protected Taste taste;
public Taste getTaste() {
return taste;
}
public void setTaste(Taste taste) {
this.taste = taste;
}
public void add(){
System.out.println("I have a cup of coffee");
}
}
package Bridge;
public class JorumCoffee extends Coffee {
public void add(){
System.out.println("I have a cup of JorumCoffee "+taste.Add()+" in");
}
}
package Bridge;
public class MediumCoffee extends Coffee {
public void add(){
System.out.println("I have a cup of MediumCoffee "+taste.Add()+" in");
}
}
package Bridge;
public class SmallCoffee extends Coffee {
public void add(){
System.out.println("I have a cup of SmallCoffee "+taste.Add()+" in");
}
}
package Bridge;
public abstract class Taste {
public abstract String Add();
}
package Bridge;
public class Lemon extends Taste {
public String Add() {
return "Lemon";
}
}
package Bridge;
public class Milk extends Taste {
public String Add() {
return "Milk";
}
}
package Bridge;
public class Sugar extends Taste {
public String Add() {
return "Sugar";
}
}
package Bridge;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Milk milk=new Milk();
Sugar sugar = new Sugar();
Lemon lemon = new Lemon();
Coffee cof=new JorumCoffee();
cof.setTaste(milk);
cof.add();
Coffee mc = new MediumCoffee();
mc.setTaste(sugar);
mc.add();
Coffee sc = new SmallCoffee();
sc.setTaste(lemon);
sc.add();
}
}
運行結果: