1. 程式人生 > 其它 >設計模式-外觀模式

設計模式-外觀模式

(1)案例背景:

在計算機主機(Mainframe)中,只需要按下主機的開機按鈕(on()),即可呼叫其他硬體裝置和軟體的啟動方法,如記憶體(Memory)的自檢(check())、CPU的執行(run())、硬碟的(HardDisk)的讀取(read())、作業系統(OS)的載入(load())等,如果某一過程發生錯誤則計算機啟動失敗。使用外觀模式模擬該過程,繪製類圖並程式設計實現。(課本230頁第二題)

(2)實現步驟:

  • 根據題意,畫出外觀模式的類圖,使主機類Mainframe充當外觀角色,記憶體類Memory,CPU類CPU,硬碟類HardDisk和作業系統類OS充當子系統角色
  • 根據類圖,編寫並實現程式碼
  • 編譯並執行程式碼,使程式碼能夠輸出模擬出來的電腦開機過程

(3)案例總結:

在以下情況下可以使用外觀模式:

  • 當要為一個複雜子系統提供一個簡單介面的時候可以使用外觀模式,該介面可以滿足大部分使用者需求,使用者也可以越過外觀類直接訪問子系統
  • 客戶程式和多個子系統之間存在很大的依賴性。引入外觀類將子系統與客戶以及其他子系統解耦,可以提高子系統的獨立性和可移植性。
  • 在層次化結構中,可以使用外觀模式定義系統中每一層的入口,層與層之間不直接產生聯絡,而是通過外觀類建立聯絡,降低層之間的耦合度。

 

 

程式碼結構:

 

 

 

 

詳細程式碼:

Memory.java:

package Mainframe.Function;



import Mainframe.Mainframe.Mainframe; public class Memory { public void check(){ System.out.println("記憶體自檢。"); } }

 


 

 

CPU.java:

package Mainframe.Function;



public class CPU {

    public void run(){

        System.out.println("CPU執行。");

    }

}

 

 


 

 

HardDisk.java:

package Mainframe.Function;



public class HardDisk {

    public void read(){

        System.out.println("硬碟讀取。");

    }

}

 

 

 

OS.java:

package Mainframe.Function;



public class OS {

    public void load(){

        System.out.println("作業系統載入。");

    }

}

 

 

 

Mainframe.java:

package Mainframe.Mainframe;



import Mainframe.Function.CPU;

import Mainframe.Function.HardDisk;

import Mainframe.Function.Memory;

import Mainframe.Function.OS;



public class Mainframe {

    public Memory memory  = new Memory();

    private CPU cpu = new CPU();

    private HardDisk hardDisk = new HardDisk();

    private OS os = new OS();



    public void on(){

        memory.check();

        cpu.run();

        hardDisk.read();

        os.load();

    }



}

 

 


 

 

Client.java:

package Mainframe;



import Mainframe.Mainframe.Mainframe;



public class Client {

    public static void main(String[] args) {

System.out.println("詳細設計實驗報告  1904班白旭君  2019005368");



        Mainframe mainframe = new Mainframe();



        mainframe.on();

    }

}

 

 


 

實驗結果: