আমার জন্য, যাওয়ার উপায়টি ছিল ইন্টারফেস এবং একটি কারখানা। এমন একটি যা ইন্টারফেসের রেফারেন্সগুলি ফিরিয়ে দেয় যার পিছনে বিভিন্ন শ্রেণি লুকিয়ে থাকতে পারে। যে ক্লাসগুলি প্রকৃত গ্রান্ট কাজ করে তাদের কারখানার সাথে নিবন্ধিত হওয়া দরকার তাই কোন ক্লাসটি প্যারামিটারের সেট দিয়ে ইনস্ট্যান্ট করতে হবে তা জানে।
দ্রষ্টব্য: ইন্টারফেসের পরিবর্তে আপনি বিমূর্ত বেস ক্লাসগুলিও ব্যবহার করতে পারেন, তবে একটি অপূর্ণতা হ'ল একক উত্তরাধিকারী ভাষার জন্য এটি আপনাকে একক বেস শ্রেণিতে সীমাবদ্ধ করে।
TRepresentationType = (rtImage, rtTable, rtGraph, ...);
Factory.RegisterReader(TJSONReader, 'json');
Factory.RegisterReader(TXMLReader, 'xml');
Factory.RegisterWriter(TPDFWriter, 'pdf');
Factory.RegisterWriter(TPowerPointWriter, 'ppt');
Factory.RegisterWriter(TWordWriter, 'doc');
Factory.RegisterWriter(TWordWriter, 'docx');
Factory.RegisterRepresentation(TPNGImage, rtImage, 'png');
Factory.RegisterRepresentation(TGIFImage, rtImage, 'gif');
Factory.RegisterRepresentation(TJPGImage, rtImage, 'jpg');
Factory.RegisterRepresentation(TCsvTable, rtTable, 'csv');
Factory.RegisterRepresentation(THTMLTable, rtTable, 'html');
Factory.RegisterRepresentation(TBarChart, rtTGraph, 'bar');
Factory.RegisterRepresentation(TPieChart, rtTGraph, 'pie');
কোডটি ডেল্ফি (পাস্কাল) বাক্যবিন্যাসে রয়েছে কারণ সেই ভাষাটি যার সাথে আমি সবচেয়ে বেশি পরিচিত।
সমস্ত বাস্তবায়নকারী ক্লাস কারখানার সাথে নিবন্ধিত হওয়ার পরে, আপনার এমন শ্রেণীর উদাহরণের জন্য একটি ইন্টারফেস রেফারেন্সের জন্য অনুরোধ করতে সক্ষম হওয়া উচিত। উদাহরণ স্বরূপ:
Factory.GetReader('SomeFileName.xml');
Factory.GetWriter('SomeExportFileName.ppt');
Factory.GetRepresentation(rtTable, 'html');
TXMLReader এর উদাহরণের জন্য একটি IReader রেফারেন্স ফিরিয়ে দেওয়া উচিত; টিপওয়ারপয়েন্ট রাইটারের একটি উদাহরণের জন্য একটি আইওয়ারাইটার রেফারেন্স এবং টিএইচটিএমএল টেবিলের একটি উদাহরণের জন্য একটি আইআরপিসারেশন রেফারেন্স।
এখন সমস্ত রেন্ডারিং ইঞ্জিনটি করা দরকার, সবকিছুকে এক সাথে বেঁধে রাখা:
procedure Render(
aDataFile: string;
aExportFile: string;
aRepresentationType: TRepresentationType;
aFormat: string;
);
var
Reader: IReader;
Writer: IWriter;
Representation: IRepresentation;
begin
Reader := Factory.GetReaderFor(aDataFile);
Writer := Factory.GetWriterFor(aExportFile);
Representation := Factory.GetRepresentationFor(aRepresentationType, aFormat);
Representation.ConstructFrom(Reader);
Writer.SaveToFile(Representation);
end;
আইআরডিডার ইন্টারফেসের উপাত্ত উপস্থাপনের জন্য আইআরপ্রেসিভেনশন বাস্তবায়নকারীদের প্রয়োজনীয় ডেটা পড়ার পদ্ধতি সরবরাহ করা উচিত। একইভাবে আইআরপিসারেশনকে এমন পদ্ধতি সরবরাহ করা উচিত যা IWriter প্রয়োগকারীদের অনুরোধ করা এক্সপোর্ট ফাইল ফর্ম্যাটে ডেটা উপস্থাপনা রফতানি করতে হবে।
আপনার ফাইলগুলির ডেটা প্রকৃতির আকারে টেবিলার হিসাবে ধরে নেওয়া, আইআরডিডার এবং এর সহায়ক ইন্টারফেসগুলি দেখতে দেখতে পারে:
IReader = interface(IInterface)
function MoveNext: Boolean;
function GetCurrent: IRow;
end;
IRow = interface(IInterface)
function MoveNext: Boolean;
function GetCurrent: ICol;
end;
ICol = interface(IInterface)
function GetName: string;
function GetValue: Variant;
end;
কোনও টেবিলের উপরে আইট্রেটেড করা তখন বিষয় হয়ে উঠবে
while Reader.MoveNext do
begin
Row := Reader.GetCurrent;
while Row.MoveNext do
begin
Col := Row.GetCurrent;
// Do something with the column's name or value
end;
end;
যেহেতু উপস্থাপনাগুলি চিত্র, গ্রাফ এবং পাঠ্য প্রকৃতির হতে পারে, আইআরপ্রেসিভেনশন সম্ভবত আইআরডিডার একইভাবে একটি নির্মিত টেবিলটি অতিক্রম করতে পারে এবং এটিতে চিত্রগুলি এবং গ্রাফগুলি পাওয়ার পদ্ধতি থাকতে পারে, উদাহরণস্বরূপ বাইটগুলির প্রবাহ হিসাবে। রফতানির লক্ষ্য অনুসারে টেবিলের মানগুলি এবং ইমেজ / গ্রাফ বাইটগুলি এনকোড করা আইওয়ারাইটার প্রয়োগকারীদের উপর নির্ভর করে।