深入淺出外觀模式(二)
3. 外觀模式應用例項
下面通過一個應用例項來進一步學習和理解外觀模式。
1. 例項說明
某軟體公司欲開發一個可應用於多個軟體的檔案加密模組,該模組可以對檔案中的資料進行加密並將加密之後的資料儲存在一個新檔案中,具體的流程包括三個部分,分別是讀取原始檔、加密、儲存加密之後的檔案,其中,讀取檔案和儲存檔案使用流來實現,加密操作通過求模運算實現。這三個操作相對獨立,為了實現程式碼的獨立重用,讓設計更符合單一職責原則,這三個操作的業務程式碼封裝在三個不同的類中。 現使用外觀模式設計該檔案加密模組。 |
2. 例項類圖
通過分析,本例項結構圖如圖4所示。
圖4 檔案加密模組結構圖
在圖4中,EncryptFacade充當外觀類,FileReader、CipherMachine和FileWriter充當子系統類。
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】
相關文章
- 深入淺出外觀模式(三)模式
- 深入淺出外觀模式(一)模式
- 深入淺出MVC模式MVC模式
- 深入淺出Seata的AT模式模式
- 深入淺出訪問者模式模式
- Tomcat深入淺出——Servlet(二)TomcatServlet
- PostgreSQL VACUUM 之深入淺出 (二)SQL
- 深入淺出UML類圖(二)
- ActiveX深入淺出(二) (轉)
- 深入淺出AQS之共享鎖模式AQS模式
- 設計模式之委派模式(Delegate Pattern)深入淺出設計模式
- 深入淺出RxJava(二:操作符)RxJava
- 深入淺出AQS之獨佔鎖模式AQS模式
- 外觀模式及其改進(二):抽象外觀類的引入模式抽象
- 深入淺出學習決策樹(二)
- 深入淺出之正規表示式(二)
- iOS設計模式之二:外觀模式和裝飾器模式iOS設計模式
- 定製 IBM Rational Method Composer V7.2 的釋出外觀IBM
- 深入淺出 Runtime(二):資料結構資料結構
- RabbitMQ由淺入深入門全總結(二)MQ
- 深入淺出Websocket(二)分散式Websocket叢集Web分散式
- 《Java專欄》 課題二:Java深入淺出Java
- 【筆記】《深入淺出MFC》第5章 總觀Application Framework筆記APPFramework
- 深入淺出Java設計之備忘錄模式Java模式
- 深入淺出FE(十四)深入淺出websocketWeb
- npm 釋出外掛NPM
- Flutter深入淺出--(二)Flutter 的發展歷程Flutter
- 《深入淺出MFC》讀書筆記(一,二) (轉)筆記
- 《深入淺出MFC》學習筆記之二 (轉)筆記
- 結合案例深入解析介面卡模式(二)模式
- 外觀模式模式
- JavaScript深入淺出非同步程式設計二、promise原理JavaScript非同步程式設計Promise
- 外觀模式及其改進(一):外觀模式概述模式
- 設計模式之外觀模式設計模式
- 設計模式-外觀模式設計模式
- 淺讀-《深入淺出Nodejs》NodeJS
- 深入淺出的webpack構建工具---DevServer配置項(二)WebdevServer
- 活動目錄的安裝:深入淺出Active Directory系列(二)