深入淺出外觀模式(二)

Liuwei-Sunny發表於2012-12-05

 

3. 外觀模式應用例項

       下面通過一個應用例項來進一步學習和理解外觀模式。

 

       1. 例項說明

       某軟體公司欲開發一個可應用於多個軟體的檔案加密模組,該模組可以對檔案中的資料進行加密並將加密之後的資料儲存在一個新檔案中,具體的流程包括三個部分,分別是讀取原始檔、加密、儲存加密之後的檔案,其中,讀取檔案和儲存檔案使用流來實現,加密操作通過求模運算實現。這三個操作相對獨立,為了實現程式碼的獨立重用,讓設計更符合單一職責原則,這三個操作的業務程式碼封裝在三個不同的類中。

       現使用外觀模式設計該檔案加密模組。

      

       2. 例項類圖

       通過分析,本例項結構圖如圖4所示。

4 檔案加密模組結構圖

       在圖4中,EncryptFacade充當外觀類,FileReaderCipherMachineFileWriter充當子系統類。

 

       3. 例項程式碼

       (1) FileReader:檔案讀取類,充當子系統類。

//FileReader.cs
using System;
using System.Text;
using System.IO;

namespace FacadeSample
{
    class FileReader
    {
        public string Read(string fileNameSrc) 
        {
	   Console.Write("讀取檔案,獲取明文:");
            FileStream fs = null;
            StringBuilder sb = new StringBuilder();
	   try
            {
                fs = new FileStream(fileNameSrc, FileMode.Open);
                int data;
    	       while((data = fs.ReadByte())!= -1) 
                {
    		sb = sb.Append((char)data);
    	       }
     	       fs.Close();
     	       Console.WriteLine(sb.ToString());
	   }
	   catch(FileNotFoundException e) 
            {
	       Console.WriteLine("檔案不存在!");
	   }
	   catch(IOException e) 
            {
	       Console.WriteLine("檔案操作錯誤!");
	   }
	   return sb.ToString();
        }
    }
}

       (2) CipherMachine:資料加密類,充當子系統類。

//CipherMachine.cs
using System;
using System.Text;

namespace FacadeSample
{
    class CipherMachine
    {
       public string Encrypt(string plainText) 
       {
	   Console.Write("資料加密,將明文轉換為密文:");
	   string es = "";
            char[] chars = plainText.ToCharArray();
	   foreach(char ch in chars) 
            {
                string c = (ch % 7).ToString();
	       es += c;
	   }
            Console.WriteLine(es);
	   return es;
	}
    }
}

       (3) FileWriter:檔案儲存類,充當子系統類。

//FileWriter.cs
using System;
using System.IO;
using System.Text;

namespace FacadeSample
{
    class FileWriter
    {
        public void Write(string encryptStr,string fileNameDes) 
        {
	   Console.WriteLine("儲存密文,寫入檔案。");
            FileStream fs = null;
	   try
            {
     	       fs = new FileStream(fileNameDes, FileMode.Create);
                byte[] str = Encoding.Default.GetBytes(encryptStr);
                fs.Write(str,0,str.Length);
                fs.Flush();
      	       fs.Close();
	   }	
	   catch(FileNotFoundException e) 
            {
		Console.WriteLine("檔案不存在!");
	   }
	   catch(IOException e) 
            {
                Console.WriteLine(e.Message);
	       Console.WriteLine("檔案操作錯誤!");
	   }		
        }
    }
}

       (4) EncryptFacade:加密外觀類,充當外觀類。

// EncryptFacade.cs
namespace FacadeSample
{
    class EncryptFacade
    {
        //維持對其他物件的引用
         private FileReader reader;
        private CipherMachine cipher;
        private FileWriter writer;

        public EncryptFacade()
        {
            reader = new FileReader();
            cipher = new CipherMachine();
            writer = new FileWriter();
        }

        //呼叫其他物件的業務方法
         public void FileEncrypt(string fileNameSrc, string fileNameDes)
        {
            string plainStr = reader.Read(fileNameSrc);
            string encryptStr = cipher.Encrypt(plainStr);
            writer.Write(encryptStr, fileNameDes);
        }
    }
}

       (5) Program:客戶端測試類

//Program.cs
using System;

namespace FacadeSample
{
    class Program
    {
        static void Main(string[] args)
        {
            EncryptFacade ef = new EncryptFacade();
            ef.FileEncrypt("src.txt", "des.txt");
            Console.Read();
        }
    }
}


        4. 結果及分析

       編譯並執行程式,輸出結果如下:

讀取檔案,獲取明文:Hello world!

資料加密,將明文轉換為密文:233364062325

儲存密文,寫入檔案。

       在本例項中,對檔案src.txt中的資料進行加密,該檔案內容為“Hello world!”,加密之後將密文儲存到另一個檔案des.txt中,程式執行後儲存在檔案中的密文為“233364062325”。在加密類CipherMachine中,採用求模運算對明文進行加密,將明文中的每一個字元除以一個整數(本例中為7,可以由使用者來進行設定)後取餘數作為密文。

【作者:劉偉 http://blog.csdn.net/lovelion

相關文章