結(jié)構(gòu)型模式(Structural Pattern)描述如何將類或者對象結(jié)合在一起形成更大的結(jié)構(gòu),就像搭積木, 可以通過簡單積木的組合形成復雜的、功能更為強大的結(jié)構(gòu)。結(jié)構(gòu)型模式可以分為類結(jié)構(gòu)型模式和對象結(jié)構(gòu)型模式,也可分為代理模式(Proxy)、適配器模式(Adapter)、橋接模式(Bridge)、裝飾模式 (Decorator )、外觀模式(Facade)、享元模式(Flyweight)和組合模式(Composite)等 7 類。
本實驗的主要目的如下。
⒈了解 7 種“結(jié)構(gòu)型模式”的定義、特點和工作原理。
⒉理解 7 種“結(jié)構(gòu)型模式”的結(jié)構(gòu)、實現(xiàn)和應用場景。
⒊學會應用 7 種“結(jié)構(gòu)型模式”進行軟件開發(fā)。
結(jié)構(gòu)型模式重點考慮類或?qū)ο蟮牟季址绞剑淠康氖菍F(xiàn)有類或?qū)ο蠼M成更大的結(jié)構(gòu)。按照其顯示方式的不同,結(jié)構(gòu)型模式可分為類結(jié)構(gòu)型模式和對象結(jié)構(gòu)型模式。前者采用繼承機制來組織接口和類,后者采用組合或聚合來組合對象。
由于組合關(guān)系和或聚合關(guān)系比繼承關(guān)系耦合度低,滿足“合成復用原則”,所以對象結(jié)構(gòu)型模式比類結(jié)構(gòu)型模式具有更大的靈活性。如果按目的來分,結(jié)構(gòu) 型模式共 7 種,每種模式的實驗大概要花 2 個學時,大家可以根據(jù)實驗計劃來選做若干個實驗。下面以代理(Proxy)模式為例,介紹其實驗過程。
代理模式是在訪問對象和目標對象之間增加一個代理對象,該對象起到中介作用和保護目標對象的作用。另外,它還可以擴展目標對象的功能,并且將客戶端與目標對象分離,這在一定程度上降低了系統(tǒng)的耦合度。
代理模式的結(jié)構(gòu)比較簡單,主要是通過定義一個繼承抽象主題的代理來包含真實主題,從而實現(xiàn)對真實主題的訪問,其結(jié)構(gòu)圖如圖 1 所示。
圖1 代理模式的結(jié)構(gòu)圖
代理模式的主要角色如下。
① 抽象主題(Subject)類:通過接口或抽象類聲明真實主題和代理對象實現(xiàn)的業(yè)務方法。
② 真實主題(Real Subject)類:實現(xiàn)了抽象主題中的具體業(yè)務,是代理對象所代表的真實對象,是最終要引用的對象。
③ 代理(Proxy)類:提供了與真實主題相同的接口,其內(nèi)部含有對真實主題的引用,它可以訪問或控制或擴展真實主題的功能。
⒈用代理模式設計一個房產(chǎn)中介的模擬程序。
要求:房產(chǎn)中介有介紹和代售韶關(guān)碧桂園房子的權(quán)利,以及登記購房者信息權(quán)利。這里的房產(chǎn)中介是代理者,韶關(guān)碧桂園是真實主題。
⒉按照以上要求設計類圖和編寫 Java 源程序。
所設計的實驗程序要滿足以下兩點。
⒈體現(xiàn)“代理模式”的工作原理。
⒉符合面向?qū)ο笾械?ldquo;開閉原則”和“里氏替換原則”。
⒈用 UML 設計“房產(chǎn)中介”模擬程序的結(jié)構(gòu)圖。
“房產(chǎn)中介”模擬程序的結(jié)構(gòu)圖如圖 2 所示。
圖2 房產(chǎn)中介模擬程序的結(jié)構(gòu)圖
⒉根據(jù)結(jié)構(gòu)圖寫出“房產(chǎn)中介”模擬程序的源代碼。
房產(chǎn)中介模擬程序的源代碼如下。
package proxy;
import java.awt.*;
import javax.swing.*;
public class SgHouseProxy
{
public static void main(String[] args)
{
HouseProxy proxy=new HouseProxy();
proxy.display();
}
}
//抽象主題:房主
interface HouseOwner
{
void display();
}
//真實主題:韶關(guān)碧桂園
class SgBiguiyuan extends JFrame implements HouseOwner
{
private static final long serialVersionUID=1L;
public SgBiguiyuan()
{
super("房產(chǎn)中介代售韶關(guān)碧桂園房子");
}
public void display()
{
this.setLayout(new GridLayout(1,1));
JLabel l1=new JLabel(new ImageIcon("src/proxy/SgBiguiyuan.jpg"));
this.add(l1);
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//代理:房產(chǎn)中介
class HouseProxy implements HouseOwner
{
private SgBiguiyuan realSubject=new SgBiguiyuan();
public void display()
{
preRequest();
realSubject.display();
postRequest();
}
public void preRequest()
{
System.out.println("房產(chǎn)中介介紹韶關(guān)碧桂園房子。");
}
public void postRequest()
{
System.out.println("房產(chǎn)中介登記購房者信息。");
}
}
⒊上機測試程序,寫出運行結(jié)果。
“房產(chǎn)中介”模擬程序的運行結(jié)果如圖 3 所示。
圖3 房產(chǎn)中介模擬程序的運行結(jié)果
⒋按同樣的步驟設計其他“結(jié)構(gòu)型模式”的程序?qū)嵗?/p>
⒌寫出實驗心得。