2.1 অ্যাডাপ্টার
অ্যাডাপ্টার (অ্যাডাপ্টার) হল একটি স্ট্রাকচারাল ডিজাইন প্যাটার্ন যা একটি বস্তুর ফাংশনগুলির ব্যবহার সংগঠিত করার জন্য ডিজাইন করা হয়েছে যা একটি বিশেষভাবে তৈরি ইন্টারফেসের মাধ্যমে পরিবর্তনের জন্য উপলব্ধ নয়।
অফিসিয়াল সংজ্ঞাটি একটু কঠিন, কিন্তু আপনি যদি এটিকে আপনার নিজের কথায় বলেন, একটি অ্যাডাপ্টার হল একটি ডিজাইন প্যাটার্ন যা বেমানান ইন্টারফেস সহ বস্তুগুলিকে একসাথে কাজ করতে দেয় ৷
![অ্যাডাপ্টার প্যাটার্ন](https://cdn.codegym.cc/images/article/95aa4e6d-a7eb-4f5b-a228-9bbe87547610/800.jpeg)
একটি বিশেষভাবে তৈরি ইন্টারফেসের মাধ্যমে পরিবর্তনের জন্য উপলব্ধ নয় এমন একটি বস্তুর ফাংশনগুলির ব্যবহার সংগঠিত করতে ব্যবহৃত হয় । একটি অতিরিক্ত ক্লাস তৈরি করা হয়েছে যার প্রয়োজনীয় ইন্টারফেস রয়েছে এবং এই শ্রেণীটি পছন্দসই বস্তুর পদ্ধতিগুলিকে কল করে (যার প্রয়োজনীয় ইন্টারফেস নেই)।
গুরুত্বপূর্ণ ! যদি কোডটিতে আপনি একটি ক্লাসের জন্য প্রত্যয় অ্যাডাপ্টারের সাথে দেখা করেন, তবে আপনার বিবেচনা করার সম্পূর্ণ অধিকার রয়েছে যে এই শ্রেণীটি একটি অ্যাডাপ্টার হিসাবে কাজ করে এবং উপরে বর্ণিত স্কিম অনুযায়ী কাজ করে এমন একটি শ্রেণীর সাথে যুক্ত।
এটি এমন ক্ষেত্রে ব্যবহৃত হয় যেখানে সিস্টেমটি প্রয়োজনীয় ডেটা এবং আচরণ সমর্থন করে, কিন্তু একটি অনুপযুক্ত ইন্টারফেস রয়েছে। অ্যাডাপ্টার প্যাটার্নের সবচেয়ে সাধারণ ব্যবহার হল যখন আপনি একটি ক্লাস তৈরি করতে চান যা একটি নতুন বা বিদ্যমান বিমূর্ত ক্লাস থেকে উত্তরাধিকারসূত্রে পাওয়া যায়।
শক্তি:
- অন্যান্য বাহ্যিক ক্লাসগুলি ব্যবহার করার জন্য রূপান্তরের জন্য সিস্টেমটি নিজেই পুনরায় কাজ করার প্রয়োজন নেই, এটি আরও একটি অ্যাডাপ্টার ক্লাস বাস্তবায়নের জন্য যথেষ্ট।
- বাহ্যিক ক্লাস বাস্তবায়ন থেকে স্বাধীনতা (লাইব্রেরি থেকে ক্লাস যার কোড আমরা পরিবর্তন করতে পারি না)। আপনার প্রোগ্রামটি বাহ্যিক ক্লাসের ইন্টারফেস থেকে স্বাধীন হয়ে যায়।
2.2 ডেকোরেটর
ডেকোরেটর হল একটি স্ট্রাকচারাল ডিজাইন প্যাটার্ন যা গতিশীলভাবে একটি বস্তুর সাথে অতিরিক্ত আচরণ সংযুক্ত করার জন্য। ডেকোরেটর প্যাটার্ন কার্যকারিতা বাড়ানোর জন্য সাবক্লাসিং অনুশীলনের একটি ভাল এবং নমনীয় বিকল্প প্রদান করে।
![ডেকোরেটর প্যাটার্ন](https://cdn.codegym.cc/images/article/c8dcccfe-d3d4-4054-bca0-a984f7371f76/800.jpeg)
একটি বস্তুর সাথে গতিশীলভাবে অতিরিক্ত বাধ্যবাধকতা সংযুক্ত করতে ব্যবহৃত হয় ।
আপনারা অনেকেই জিজ্ঞাসা করবেন: আপনি কীভাবে গতিশীলভাবে (যখন প্রোগ্রামটি চলছে) একটি বস্তুতে নতুন আচরণ যুক্ত করতে পারেন? একটি বস্তু টুকরা থেকে একত্রিত করা যেতে পারে, অর্থাৎ, ছোট বস্তু। servlets মধ্যে ফিল্টার চেইন মনে রাখবেন? অথবা স্ট্রিম API যখন আপনি ফিল্টার(), মানচিত্র(), তালিকা() ব্যবহার করে একটি ক্যোয়ারী লিখেছেন?
IntStream.of(50, 60, 70, 80, 90).filter(x -> x < 90).map(x -> x + 10).limit(3).forEach(System.out::print);
ডেকোরেটর প্যাটার্নের শক্তি:
- একটি বস্তুর কার্যকারিতা প্রসারিত করার জন্য উপশ্রেণী তৈরি করার প্রয়োজন নেই।
- যে কোনো জায়গায় গতিশীলভাবে নতুন কার্যকারিতা সংযুক্ত করার ক্ষমতা: ConcreteComponent অবজেক্টের প্রধান কার্যকারিতার আগে বা পরে।
2.3 প্রক্সি
প্রক্সি হল একটি স্ট্রাকচারাল ডিজাইন প্যাটার্ন যা একটি অবজেক্ট প্রদান করে যা অন্য বস্তুর অ্যাক্সেস নিয়ন্ত্রণ করে, এর সমস্ত কলকে বাধা দেয় এবং পাস করে।
![ডেপুটি (প্রক্সি)](https://cdn.codegym.cc/images/article/5f67cf48-0f30-42ca-aa0c-661e9121210d/800.jpeg)
প্রক্সি প্যাটার্ন বাস্তব বস্তুর পরিবর্তে একটি বিকল্প বস্তু প্রদান করে। এই বস্তুটি মূল বস্তুর অ্যাক্সেস নিয়ন্ত্রণ করে। খুব প্রায়ই ব্যবহার করা হয়.
মনে আছে কিভাবে আমরা Mockito ফ্রেমওয়ার্ক ব্যবহার করেছি এবং Mockito.spy() পদ্ধতি বা @Spy টীকা ব্যবহার করে একটি বাস্তব বস্তুতে কল বাধা দিয়েছি? এটি তখনই একটি বিশেষ প্রক্সি অবজেক্ট তৈরি করা হয়েছিল, যার মাধ্যমে আসল বস্তুর সমস্ত কল পাস হয়েছিল।
এবং তারপর আমরা বস্তুর নিয়ম যোগ করে এই কল পরিচালনা করতে পারে. এটা ঠিক - আসল বস্তুটি পরিবর্তন হয় না এবং এটির সাথে কাজ করা অনেক বেশি নমনীয় হয়ে ওঠে। এটি বিশেষভাবে উপযোগী যখন আমরা আমাদের কোড থেকে প্রক্সি অবজেক্টকে কল করি না, কিন্তু এটিকে কোথাও পাস করি। এইভাবে আমাদের স্বাধীন দুটি বস্তুর যোগাযোগ নিয়ন্ত্রণ.
উদ্দেশ্য অনুসারে প্রক্সির প্রকারগুলি :
- লগিং প্রক্সি : "বিষয়"-এ সমস্ত কল তাদের পরামিতি সহ লগ করে।
- রিমোট প্রক্সি (রিমোট প্রক্সি): "বিষয়" এর সাথে যোগাযোগ প্রদান করে, যা একটি ভিন্ন ঠিকানার স্থানে বা একটি দূরবর্তী মেশিনে থাকে। এটি অনুরোধ এবং এর আর্গুমেন্টগুলিকে এনকোড করার জন্য এবং প্রকৃত "বিষয়"-এ এনকোড করা অনুরোধ পাঠানোর জন্য দায়ী হতে পারে৷
- ভার্চুয়াল প্রক্সি (ভার্চুয়াল প্রক্সি): নিশ্চিত করে যে প্রকৃত "বিষয়" শুধুমাত্র তখনই তৈরি হয় যখন এটি সত্যিই প্রয়োজন হয়। এটি প্রকৃত "বিষয়" সম্পর্কে কিছু তথ্য ক্যাশ করতে পারে যাতে এটি তৈরি করতে বিলম্ব হয়।
- কপি-অন-রাইট : যখন ক্লায়েন্ট কিছু ক্রিয়া সম্পাদন করে তখন "বিষয়" এর একটি অনুলিপি প্রদান করে ("ভার্চুয়াল প্রক্সি" এর একটি বিশেষ ক্ষেত্রে)।
- সুরক্ষা প্রক্সি : অনুরোধ করার জন্য কলারের প্রয়োজনীয় অনুমতি আছে কিনা তা পরীক্ষা করতে পারে।
- ক্যাশিং প্রক্সি : ফলাফল শেয়ার করতে পারে এমন একাধিক ক্লায়েন্টকে পরিবেশন করার আগে গণনার ফলাফলের অস্থায়ী স্টোরেজ প্রদান করে।
- স্ক্রীনিং প্রক্সি: বিপজ্জনক ক্লায়েন্ট (বা বিপরীত) থেকে "বিষয়" রক্ষা করে।
- সিঙ্ক্রোনাইজেশন প্রক্সি : একটি অ্যাসিঙ্ক্রোনাস মাল্টি-থ্রেডেড পরিবেশে "বিষয়"-এ সিঙ্ক্রোনাইজড অ্যাক্সেস নিয়ন্ত্রণ করে।
- "স্মার্ট" লিঙ্ক (স্মার্ট রেফারেন্স প্রক্সি): "বিষয়" এর একটি লিঙ্ক তৈরি করা হলে অতিরিক্ত ক্রিয়া সম্পাদন করে, উদাহরণস্বরূপ, "বিষয়" এর সক্রিয় লিঙ্কের সংখ্যা গণনা করে।
2.4 সেতু
ব্রিজ প্যাটার্ন হল একটি স্ট্রাকচারাল ডিজাইন প্যাটার্ন যা "আলাদা বিমূর্ততা এবং বাস্তবায়নের জন্য ব্যবহৃত হয় যাতে তারা স্বাধীনভাবে পরিবর্তন করতে পারে।"
ব্রিজ প্যাটার্নটি এনক্যাপসুলেশন, এগ্রিগেশন ব্যবহার করে এবং ক্লাসের মধ্যে দায়িত্ব ভাগ করার জন্য উত্তরাধিকার ব্যবহার করতে পারে।
![সেতু](https://cdn.codegym.cc/images/article/ec00bb42-3e78-4eb5-9b0d-b72ed9a63d4f/800.jpeg)
যখন বিমূর্ততা এবং বাস্তবায়ন পৃথক করা হয়, তারা স্বাধীনভাবে পরিবর্তন করতে পারে। অন্য কথায়, ব্রিজ প্যাটার্নের মাধ্যমে বাস্তবায়িত হলে, ইন্টারফেসের কাঠামো পরিবর্তন করা বাস্তবায়নের কাঠামো পরিবর্তনে হস্তক্ষেপ করে না।
একটি চিত্র হিসাবে যেমন একটি বিমূর্ততা বিবেচনা করুন. অনেক ধরণের আকার রয়েছে, যার প্রত্যেকটির নিজস্ব বৈশিষ্ট্য এবং পদ্ধতি রয়েছে। যাইহোক, এমন কিছু আছে যা সমস্ত পরিসংখ্যানকে একত্রিত করে। উদাহরণস্বরূপ, প্রতিটি আকৃতি নিজেকে আঁকতে সক্ষম হতে হবে, স্কেল, এবং তাই।
একই সময়ে, অঙ্কন গ্রাফিক্স OS বা গ্রাফিক্স লাইব্রেরির প্রকারের উপর নির্ভর করে ভিন্ন হতে পারে। আকারগুলি বিভিন্ন গ্রাফিক্স পরিবেশে নিজেকে আঁকতে সক্ষম হওয়া উচিত। কিন্তু প্রতিটি আকৃতিতে সমস্ত অঙ্কন পদ্ধতি প্রয়োগ করা, বা প্রতিবার অঙ্কন পদ্ধতি পরিবর্তন করার সময় আকৃতি পরিবর্তন করা অবাস্তব।
এই ক্ষেত্রে, সেতু প্যাটার্ন সাহায্য করে, আপনাকে নতুন ক্লাস তৈরি করতে দেয় যা বিভিন্ন গ্রাফিকাল পরিবেশে অঙ্কন বাস্তবায়ন করবে। এই পদ্ধতি ব্যবহার করে, নতুন আকার এবং সেগুলি আঁকার উপায় উভয়ই যোগ করা খুব সহজ।
ডায়াগ্রামে তীর দ্বারা উপস্থাপিত সংযোগের 2টি অর্থ থাকতে পারে: ক) "একটি প্রকার", লিস্কভ প্রতিস্থাপন নীতি অনুসারে, এবং খ) বিমূর্তকরণের সম্ভাব্য বাস্তবায়নের একটি। ভাষাগুলি সাধারণত a) এবং b) উভয়ই বাস্তবায়নের জন্য উত্তরাধিকার ব্যবহার করে, যা শ্রেণী শ্রেণিবিন্যাসের প্রবণতা বাড়ায়।
সেতুটি ঠিক এই সমস্যাটি সমাধানের জন্য কাজ করে: অবজেক্টগুলি একটি শ্রেণির শ্রেণিবিন্যাস A এবং শ্রেণিবিন্যাস B এর একটি বস্তু থেকে জোড়ায় তৈরি করা হয়, লিসকভের মতে অনুক্রম A-এর মধ্যে উত্তরাধিকারের অর্থ "বৈচিত্র্য" এবং "বাস্তবায়ন" ধারণার জন্য অবজেক্ট A থেকে এর পেয়ার করা অবজেক্ট B এর একটি লিঙ্ক ব্যবহার করা হয়।
2.5 সম্মুখভাগ
Facade প্যাটার্ন হল একটি স্ট্রাকচারাল ডিজাইন প্যাটার্ন যা একটি সিস্টেমের সমস্ত সম্ভাব্য বাহ্যিক কলগুলিকে একটি একক অবজেক্টে কমিয়ে দিয়ে সিস্টেমের জটিলতাকে লুকিয়ে রাখে যা সেগুলিকে সিস্টেমের উপযুক্ত বস্তুগুলিতে অর্পণ করে।
![সম্মুখ টেমপ্লেট](https://cdn.codegym.cc/images/article/e6717d3d-f5fb-467f-866c-0c610c2d4a4e/800.jpeg)
কিভাবে একটি ইউনিফাইড ইন্টারফেস প্রদান করা যায় ভিন্ন ভিন্ন বাস্তবায়ন বা ইন্টারফেসের একটি সেট সহ, উদাহরণস্বরূপ, একটি সাবসিস্টেমে, যদি সেই সাবসিস্টেমের সাথে শক্তিশালী সংযোগ অবাঞ্ছিত হয়, বা সাবসিস্টেমের বাস্তবায়ন পরিবর্তন হতে পারে?
সাবসিস্টেমের সাথে ইন্টারঅ্যাকশনের একটি বিন্দু সংজ্ঞায়িত করুন - একটি সম্মুখ অবজেক্ট যা সাবসিস্টেমের সাথে একটি সাধারণ ইন্টারফেস প্রদান করে এবং এটিকে এর উপাদানগুলির সাথে ইন্টারঅ্যাকশন করার দায়িত্ব অর্পণ করুন। একটি সম্মুখভাগ একটি বাহ্যিক বস্তু যা সাবসিস্টেম পরিষেবাগুলির জন্য একটি একক এন্ট্রি পয়েন্ট প্রদান করে।
অন্যান্য সাবসিস্টেম উপাদানগুলির বাস্তবায়ন ব্যক্তিগত এবং বাহ্যিক উপাদানগুলির কাছে দৃশ্যমান নয়। ফ্যাকাড অবজেক্ট সাবসিস্টেম বাস্তবায়নে পরিবর্তনের বিরুদ্ধে সুরক্ষার শর্তে পরিবর্তনের জন্য প্রতিরোধী GRASP প্যাটার্নের বাস্তবায়ন প্রদান করে।
গুরুত্বপূর্ণ ! এই প্যাটার্নটি ব্যবহার করা হয় যখন আমরা কিছু গোষ্ঠীকে সম্পূর্ণরূপে আড়াল করতে চাই এবং আমাদের বস্তুর মাধ্যমে তাদের সাথে সমস্ত যোগাযোগ পাস করতে চাই। আপনি যদি বস্তুর যোগাযোগ প্রক্রিয়ার উপর কিছু নিয়ন্ত্রণ প্রদান করতে চান এবং অগত্যা সেগুলি লুকিয়ে রাখতে চান না, তাহলে প্রক্সি প্যাটার্ন ব্যবহার করা ভাল।
GO TO FULL VERSION