প্রক্সি, ডেকোরেটর, অ্যাডাপ্টার এবং ব্রিজ প্যাটার্নগুলি কীভাবে পৃথক হবে?


403

আমি প্রক্সি প্যাটার্নটির দিকে চেয়ে ছিলাম এবং আমার কাছে এটি ডেকরেটর, অ্যাডাপ্টার এবং সেতুর নিদর্শনগুলির মতো একটি ভয়াবহ লাগে। আমি কি কিছু ভুল বুঝছি? পার্থক্য কি? আমি কেন অন্যদের তুলনায় প্রক্সি প্যাটার্নটি ব্যবহার করব? বাস্তব বিশ্বের প্রকল্পগুলিতে আপনি কীভাবে অতীতে তাদের ব্যবহার করেছেন?


4
প্রায়শই এমন নিদর্শন রয়েছে যা দেখতে খুব সাদৃশ্যপূর্ণ তবে তাদের উদ্দেশ্যগুলির মধ্যে পৃথক (কৌশল এবং রাষ্ট্রীয় নিদর্শনগুলি মাথায় আসে)। আমি মনে করি এটি প্রায়শই এই কারণে ঘটে যে ডিজাইনের ধরণগুলি সাধারণ শক্ত নকশার নীতিগুলির ভিত্তিতে হয়।
জেসন ডাউন

5
ভাল, এই চারটি নিদর্শনগুলির যথাযথ একই প্রয়োগের বিশদ রয়েছে। রাষ্ট্রীয় আয়াত কৌশলটি কমপক্ষে রাষ্ট্র-পূর্ণ আয়াতকে রাজ্যহীন হিসাবে বর্ণনা করা যেতে পারে (বেশিরভাগ অংশে)। প্রায়শই, কৌশলটি কেবলমাত্র পদ্ধতিতে ইনজেকশন হয়, যেখানে রাষ্ট্রীয় প্যাটার্নটি ইন্টারফেস ব্যবহার করে আরও কিছু করার জন্য একটি পদ্ধতি কলকে বিমূর্ত করে তোলে। কৌশলটি, দিনের শেষে, ওও বিশ্বে কার্যকরী প্রোগ্রামিংয়ের অনুমতি দেওয়ার জন্য একটি হ্যাক।
চার্লস গ্রাহাম

উত্তর:


648

প্রক্সি, ডেকোরেটর, অ্যাডাপ্টার এবং ব্রিজ একটি শ্রেণি "মোড়ানোর" ক্ষেত্রে সমস্ত প্রকারভেদ। তবে তাদের ব্যবহার আলাদা।

  • আপনি যখন কোনও বস্তুকে অলস-ইনস্ট্যান্টিয়েট করতে চান বা আপনি কোনও দূরবর্তী পরিষেবাটি কল করছেন বা অবজেক্টে অ্যাক্সেস নিয়ন্ত্রণ করতে চান তখন প্রক্সি ব্যবহার করা যেতে পারে।

  • সাজসজ্জারকে "স্মার্ট প্রক্সি "ও বলা হয়। আপনি যখন কোনও বস্তুতে কার্যকারিতা যুক্ত করতে চান তবে এটি ব্যবহার করা হয় তবে সেই বস্তুর প্রকারটি প্রসারিত করে নয়। এটি রানটাইমে আপনাকে এটি করতে দেয়।

  • অ্যাডাপ্টার ব্যবহার করা হয় যখন আপনার কোনও বিমূর্ত ইন্টারফেস থাকে এবং আপনি সেই ইন্টারফেসটিকে অন্য কোনও অবজেক্টে ম্যাপ করতে চান যার অনুরূপ কার্যকরী ভূমিকা রয়েছে তবে ভিন্ন ইন্টারফেস।

  • ব্রিজ অ্যাডাপ্টারের সাথে খুব সমান, তবে আপনি যখন অ্যাবস্ট্রাক্ট ইন্টারফেস এবং অন্তর্নিহিত বাস্তবায়ন উভয়টি সংজ্ঞায়িত করেন তখন আমরা এটিকে ব্রিজ বলি। অর্থাৎ আপনি কিছু উত্তরাধিকার বা তৃতীয় পক্ষের কোডের সাথে মানিয়ে নিচ্ছেন না, আপনি সমস্ত কোডের ডিজাইনার তবে আপনাকে বিভিন্ন বাস্তবায়ন স্বেচ্ছায় সক্ষম করতে হবে।

  • ফেকাড হ'ল এক বা একাধিক শ্রেণীর সাবসিস্টেমের একটি উচ্চ-স্তরের (পড়ুন: সহজ) ইন্টারফেস। ধরুন আপনার একটি জটিল ধারণা রয়েছে যার প্রতিনিধিত্ব করার জন্য একাধিক বস্তুর প্রয়োজন। অবজেক্টের সেটে পরিবর্তন করা বিভ্রান্তিকর, কারণ আপনি সর্বদা জানেন না যে কোন বস্তুর জন্য আপনার কল করার পদ্ধতি রয়েছে। আপনি অবজেক্ট সংগ্রহের জন্য যে জটিল জটিল ক্রিয়াকলাপগুলি করতে পারেন তার জন্য উচ্চ-স্তরের পদ্ধতি সরবরাহ করে এমন একটি ফ্যাসেড লেখার সময়। উদাহরণ: একটি স্কুল অধ্যায় জন্য একটি ডোমেন মডেল, মত পদ্ধতি countStudents(), reportAttendance(), assignSubstituteTeacher(), ইত্যাদি।


7
ভাল উত্তর. আপনি বন্য যেখানে এটি দেখতে পাচ্ছেন তার কয়েকটি উদাহরণ যোগ করার উপযুক্ত হতে পারে? যেমন ওয়েব পরিষেবাদিতে প্রক্সি ক্লাস। আমার কাছ থেকে +1
রব কুপার 19

5
@ রব: ধন্যবাদ, তবে আমি এই উত্তরটি সংক্ষিপ্ত এবং মিষ্টি রাখব। আমি বন্য মধ্যে উদাহরণ সহ আপনি অন্য উত্তর লিখতে উত্সাহিত করি!
বিল কারভিন

8
@ রবার্টডাইলি ডেকোরেটর নিয়ন্ত্রণের ধরণের শ্রেণিবিন্যাস এড়াতে ভাল। উদাহরণস্বরূপ , বলুন আপনার একটি জিইউআইতে একটি উইন্ডো রয়েছে এবং আপনি alচ্ছিক স্ক্রোল বারগুলি রাখতে চান। আপনার উইন্ডো, ভিএসক্রোল উইন্ডো, এইচএসক্রোল উইন্ডো এবং ভিএইচক্রোল উইন্ডো ক্লাস থাকতে পারে বা আপনি উইন্ডোতে ভিএসক্রোল এবং এইচএসক্রোল সজ্জকার তৈরি করতে পারেন।
ইভা

1
@RobertDailey, প্রসাধক হয় রচনা।
বিল কারভিন

1
এবং আপনি যদি মোড়ানো বস্তুর 1: 1 এর ইন্টারফেসটি নকল করতে চান তবে আরও কয়েকটি অতিরিক্ত পদ্ধতি যুক্ত করতে চান? এটি কি ডেকরেটার বা অ্যাডাপ্টার?
donquixote

198

বিলের উত্তর যেমন বলেছে, তাদের ব্যবহারের মামলাগুলি আলাদা

তাদের স্ট্রাকচারগুলিও তাই।

  • প্রক্সি এবং ডেকোরেটর উভয়েরই তাদের মোড়ানো প্রকারের মতো একই ইন্টারফেস রয়েছে তবে প্রক্সিটি হুডের নীচে একটি উদাহরণ তৈরি করে, যেখানে সাজসজ্জারটি কনস্ট্রাক্টরে একটি উদাহরণ নেয়।

  • অ্যাডাপ্টার এবং মুখোমুখি উভয়েরই যা তারা জড়িয়ে রাখে তার চেয়ে আলাদা ইন্টারফেস থাকে। তবে অ্যাডাপ্টারটি একটি বিদ্যমান ইন্টারফেস থেকে উদ্ভূত হয়, যেখানে মুখোমুখি একটি নতুন ইন্টারফেস তৈরি করে।

  • একটি বিদ্যমান ধরণের ব্রিজ এবং অ্যাডাপ্টার উভয় বিন্দু। তবে সেতুটি একটি বিমূর্ত প্রকারে নির্দেশ করবে এবং অ্যাডাপ্টারটি একটি কংক্রিটের ধরণের দিকে নির্দেশ করতে পারে। ব্রিজটি আপনাকে রানটাইমে বাস্তবায়নের সাথে যুক্ত করার অনুমতি দেয়, তবে অ্যাডাপ্টারটি সাধারণত এটি করে না।


30
আপনার উত্তরটি বিলের 5 টি চ্যাপ্টার ডিজাইনের প্যাটার্নগুলির খুব সুন্দরভাবে গুটিয়ে রাখে। যে কেউ তাদেরকে বইয়ের উচ্চ স্তরের (পড়ুন: সহজ) ইন্টারফেস বলতে পারে।
জোনাস আইশর

54

আমার এই বিষয়ে।

চারটি নিদর্শনগুলির মধ্যে প্রচুর পরিমাণে মিল রয়েছে, চারটিই মাঝে মাঝে অনানুষ্ঠানিকভাবে মোড়ক, বা মোড়কের ধরণ বলে। সমস্ত ব্যবহার রচনা, মোড়ানো বিষয় এবং কোনও সময়ে নির্বাহের কার্য নির্ধারণ করে, একটি পদ্ধতি কলকে অন্যটিতে ম্যাপিং করে। তারা ক্লায়েন্টকে কোনও আলাদা অবজেক্ট তৈরি করতে এবং সমস্ত প্রাসঙ্গিক ডেটা অনুলিপি করার প্রয়োজনীয়তা ছাড়ায়। যদি বুদ্ধিমানের সাথে ব্যবহার করা হয় তবে এগুলি মেমরি এবং প্রসেসর সংরক্ষণ করে।

আলগা সংযোগ প্রচারের মাধ্যমে তারা একবারে স্থিতিশীল কোডটি অনিবার্য পরিবর্তনগুলিতে কম উন্মুক্ত করে এবং সহ বিকাশকারীদের জন্য আরও ভাল পঠনযোগ্য হয়।

এডাপটার

অ্যাডাপ্টার একটি পৃথক ইন্টারফেসে বিষয় (অ্যাডাপ্টি) অ্যাডাপ্ট করে। এইভাবে আমরা নামমাত্র বিভিন্ন ধরণের সংকলনে অবজেক্ট যুক্ত করতে পারি।

অ্যাডাপ্টার কেবল ক্লায়েন্টের কাছে প্রাসঙ্গিক পদ্ধতি প্রকাশ করে, অন্য সকলকে সীমাবদ্ধ করতে পারে, নির্দিষ্ট প্রসঙ্গে যেমন বাইরের লাইব্রেরিটি অভিযোজিত করার জন্য ব্যবহারের অভিপ্রায় প্রকাশ করে, এটি আমাদের অ্যাপ্লিকেশন প্রয়োজনীয়তার দিকে কম সাধারণ প্রদর্শিত এবং আরও বেশি দৃষ্টি নিবদ্ধ করে। অ্যাডাপ্টারগুলি আমাদের কোডের পঠনযোগ্যতা এবং স্ব বিবরণ বাড়ায়।

অ্যাডাপ্টারগুলি অন্য দলগুলির অস্থির কোড থেকে একটি দলকে রক্ষা করে; অফশোর দলগুলির সাথে ডিল করার সময় একটি জীবন রক্ষাকারী সরঞ্জাম ;-)

উল্লেখযোগ্য উদ্দেশ্য হ'ল বিষয়শ্রেণীটিকে টীকা দেওয়ার কারণে বাধা দেওয়া। টীকাগুলির উপর ভিত্তি করে অনেকগুলি ফ্রেমওয়ার্ক সহ এটি তখনকার চেয়ে আরও বেশি গুরুত্বপূর্ণ ব্যবহারে পরিণত হয়।

অ্যাডাপ্টার কেবলমাত্র একক উত্তরাধিকারের জাভা সীমাবদ্ধতা পেতে সহায়তা করে। এটি এক খামের অধীনে বেশ কয়েকটি অ্যাডাপিটিকে একত্রে একাধিক উত্তরাধিকারের ছাপ দিতে পারে।

কোড অনুযায়ী, অ্যাডাপ্টারটি "পাতলা"। এটি অ্যাডিপিটি ক্লাসে খুব বেশি কোড যুক্ত করা উচিত নয়, কেবল এই জাতীয় কল করার জন্য অ্যাডাপি পদ্ধতি এবং মাঝে মাঝে ডেটা রূপান্তরকে কল করা ছাড়াও।

জেডিকে বা বেসিক লাইব্রেরিতে খুব ভাল অ্যাডাপ্টারের উদাহরণ নেই। অ্যাপ্লিকেশন বিকাশকারীরা অ্যাপ্লিকেশন নির্দিষ্ট ইন্টারফেসের সাথে গ্রন্থাগারগুলিকে অভিযোজিত করতে অ্যাডাপ্টার তৈরি করে।

প্রসাধক

সাজসজ্জাকারী কেবল ডেলিগেটই করেন না, কেবল একটি পদ্ধতিকে অন্যটিতে মানচিত্র করে না, তারা আরও কিছু করেন, কিছু বিষয় পদ্ধতির আচরণ পরিবর্তন করে, এটি সিদ্ধান্ত নিতে পারে সাবজেক্ট মেথডকে একেবারেই না বলার জন্য, কোনও ভিন্ন অবজেক্টকে, কোনও সহায়ক সামগ্রীর প্রতিনিধিত্ব করে।

আলংকারকগণ সাধারণত মোড়কযুক্ত আইটেমে লগিং, এনক্রিপশন, ফর্ম্যাটিং, বা বিষয়কে সংকোচনের ক্ষেত্রে (স্বচ্ছভাবে) কার্যকারিতা যুক্ত করেন। এই নতুন কার্যকারিতা অনেক নতুন কোড আনতে পারে। সুতরাং, সাজসজ্জা সাধারণত অনেকগুলি "ফ্যাটার" তারপরে অ্যাডাপ্টারগুলি।

সাজসজ্জারকে অবশ্যই সাবজেক্টের ইন্টারফেসের একটি উপ-শ্রেণি হতে হবে। এগুলি এর বিষয়গুলির পরিবর্তে স্বচ্ছভাবে ব্যবহার করা যেতে পারে। বাফার্ডআউটপুট স্ট্রিম দেখুন, এটি এখনও আউটপুট স্ট্রিম এবং এটি হিসাবে ব্যবহার করা যেতে পারে। এটি অ্যাডাপ্টারগুলির থেকে একটি বড় প্রযুক্তিগত পার্থক্য।

পুরো সাজসজ্জার পরিবারের পাঠ্য বইয়ের উদাহরণগুলি জেডিকে সহজেই রয়েছে - জাভা আইও। মত সব শ্রেণীর BufferedOutputStream , FilterOutputStream এবং ObjectOutputStream এর টেকনিক হয় OutputStream । এগুলি পেঁয়াজ স্তরযুক্ত হতে পারে, যেখানে একটি করে সাজসজ্জা সজ্জিত করা হয়, আরও কার্যকারিতা যুক্ত করে।

প্রক্সি

প্রক্সি একটি সাধারণ মোড়ক নয়। মোড়কযুক্ত বস্তু, প্রক্সি বিষয়, প্রক্সি তৈরির সময় উপস্থিত থাকতে পারে। প্রক্সি প্রায়শই এটি অভ্যন্তরীণভাবে তৈরি করে। এটি চাহিদার ভিত্তিতে তৈরি হওয়া ভারী বস্তু হতে পারে, বা এটি বিভিন্ন জেভিএম বা বিভিন্ন নেটওয়ার্ক নোডের রিমোট অবজেক্ট এবং এমনকি জাভা-বিহীন অবজেক্ট, দেশীয় কোডের একটি উপাদান। এটি কোনও প্রয়োজনে মোড়ানো বা অন্য কোনও বস্তুর কাছে অর্পণ করার দরকার নেই।

সর্বাধিক সাধারণ উদাহরণগুলি হ'ল দূরবর্তী প্রক্সি, ভারী অবজেক্টের সূচনা এবং অ্যাক্সেস প্রক্সি।

  • রিমোট প্রক্সি - বিষয়গুলি রিমোট সার্ভারে, বিভিন্ন জেভিএম বা এমনকি জাভা সিস্টেমে নেই। প্রক্সি ক্লায়েন্টকে অন্তর্নিহিত প্রযুক্তির সংস্পর্শ থেকে রক্ষা করে আরএমআই / আরইএসটি / এসওএপি কলগুলিতে বা যা প্রয়োজন প্রয়োজনে মেথড কলগুলি অনুবাদ করে।

  • অলস লোড প্রক্সি - কেবলমাত্র প্রথম ব্যবহার বা প্রথম নিবিড় ব্যবহারের পুরোপুরি বস্তুর সূচনা করুন।

  • অ্যাক্সেস প্রক্সি - সাবজেক্টে অ্যাক্সেস নিয়ন্ত্রণ করুন।

অট্টালিকার সদরের বহির্ভাগ

ফ্যাসাদ ন্যূনতম জ্ঞানের নকশার নীতি (ডেমিটারের আইন) এর সাথে ঘনিষ্ঠভাবে জড়িত। মুখোমুখি অ্যাডাপ্টারের সাথে খুব মিল। তারা উভয়ই মোড়ানো, তারা উভয়ই একটির সাথে অন্য একটি বস্তুর মানচিত্র তৈরি করে তবে উদ্দেশ্যতে তারা পৃথক হয়। ফেকাড একটি জটিল জটিল কাঠামোকে জটিল করে তোলে, জটিল অবজেক্ট গ্রাফ, জটিল কাঠামোটিতে অ্যাক্সেসকে সহজ করে তোলে।

সম্মুখভাগ একটি জটিল কাঠামো মোড়ানো, এটিতে একটি ফ্ল্যাট ইন্টারফেস সরবরাহ করে। এটি ক্লায়েন্ট অবজেক্টকে বিষয় কাঠামোর অভ্যন্তরীণ সম্পর্কের সংস্পর্শে আনা থেকে বাধা দেয় তাই আলগা সংযোগ প্রচার করে।

সেতু

অ্যাডাপ্টার প্যাটার্নের আরও জটিল বৈকল্পিক যেখানে কেবল প্রয়োগের ক্ষেত্রেই পরিবর্তন হয় না তবে বিমূর্ততাও রয়েছে। এটি প্রতিনিধিদলে আরও একটি উদ্বিগ্নতা যুক্ত করে। অতিরিক্ত প্রতিনিধি হলেন সেতু। এটি অ্যাডাপ্টারটিকে অ্যাডাপ্টিং ইন্টারফেস থেকেও ডেস্পল করে। এটি অন্যান্য মোড়কের ধরণগুলির তুলনায় জটিলতা আরও বাড়ায়, তাই যত্ন সহ প্রয়োগ করুন।

নির্মাতাদের মধ্যে পার্থক্য

প্যাটার্ন পার্থক্যগুলি তাদের নির্মাতাদের দিকে তাকানোর সময়ও সুস্পষ্ট।

  • প্রক্সি কোনও বিদ্যমান অবজেক্টকে মোড়ানো করছে না। কনস্ট্রাক্টরের কোনও বিষয় নেই।

  • ডেকোরেটর এবং অ্যাডাপ্টার ইতিমধ্যে বিদ্যমান বস্তুটি মোড়ানো করে এবং এগুলি সাধারণত
    কন্সট্রাক্টরে সরবরাহ করা হয়।

  • ফ্যাসেড কনস্ট্রাক্টর পুরো অবজেক্ট গ্রাফের মূল উপাদানটি নেয়, অন্যথায় এটি অ্যাডাপ্টারের মতোই লাগে।

বাস্তব জীবনের উদাহরণ - জেএক্সবি মার্শালিং অ্যাডাপ্টার । এই অ্যাডাপ্টারের উদ্দেশ্যটি হ'ল একটি সহজ সমতল শ্রেণীর ম্যাপিং করা হয় আরও জটিল কাঠামোতে বাহ্যিকভাবে প্রয়োজনীয় এবং অতিরিক্ত টীকা সহ "দূষণকারী" বিষয় শ্রেণি রোধ করা।


30

অনেকগুলি জিওএফ নিদর্শনগুলিতে প্রচুর পরিমাণে ওভারল্যাপ রয়েছে। এগুলি সবই বহুবৈচিত্র্যের শক্তির উপর নির্মিত এবং কখনও কখনও কেবলমাত্র অভিপ্রায় ভিন্ন হয়। (কৌশল বনাম রাজ্য)

প্রথম ফার্স্ট ডিজাইনের প্যাটার্নগুলি পড়ার পরে আমার নিদর্শনগুলি বোঝার পরিমাণ 100 গুণ বেড়েছে ।

আমি এটি সুপারিশ!


9

বিশেষজ্ঞদের কাছ থেকে সমস্ত ভাল উত্তর ইতিমধ্যে ব্যাখ্যা করেছে যে প্রতিটি প্যাটার্নটি কী বোঝায়।

আমি মূল পয়েন্টগুলি সাজাইয়া দেব ।

প্রসাধক:

  1. রান সময় অবজেক্টের সাথে আচরণ যুক্ত করুন । উত্তরাধিকার এই কার্যকারিতা অর্জনের মূল চাবিকাঠি, যা এই প্যাটার্নটির সুবিধা এবং অসুবিধা উভয়ই।
  2. এটি ইন্টারফেসের আচরণটি পরিবর্তন করে ।

যেমন (শৃঙ্খলা সহ): & ইন্টারফেস java.ioসম্পর্কিত প্যাকেজ ক্লাসInputStreamOutputStream

FileOutputStream fos1 = new FileOutputStream("data1.txt");  
ObjectOutputStream out1 = new ObjectOutputStream(fos1);

প্রক্সি:

  1. অলস সূচনা, অবজেক্টটিকে ক্যাশে করে এবং ক্লায়েন্ট / কলারের অ্যাক্সেস নিয়ন্ত্রণ করে পারফরম্যান্স উন্নতি করতে এটি ব্যবহার করুন । এটি বিকল্প আচরণ সরবরাহ করতে পারে বা রিয়েল অবজেক্টকে কল করতে পারে। এই প্রক্রিয়া চলাকালীন, এটি নতুন অবজেক্ট তৈরি করতে পারে।
  2. ভিন্ন প্রসাধক , যা বস্তুর chaining মঞ্জুরি দেয় যা প্রক্সি chaining অনুমতি দেয় না।

যেমন: java.rmiপ্যাকেজ ক্লাস।

নাটক:

  1. এটি দুটি সম্পর্কিত নয় এমন ইন্টারফেসকে বিভিন্ন বস্তুর মাধ্যমে একসাথে কাজ করার অনুমতি দেয় , সম্ভবত একই ভূমিকা পালন করে।
  2. এটি আসল ইন্টারফেসটি পরিবর্তন করে

যেমন java.io.InputStreamReader( InputStreamএকটি ফেরত Reader)

সেতু:

  1. এটি বিমূর্ততা এবং বাস্তবায়ন উভয়ই স্বাধীনভাবে পরিবর্তিত হতে দেয়
  2. এটি উত্তরাধিকারের উপর রচনা ব্যবহার করে

যেমন সংগ্রহ ক্লাস java.utilListদ্বারা বাস্তবায়িত ArrayList

মূল নোট:

  1. অ্যাডাপ্টার তার বিষয়টির জন্য একটি পৃথক ইন্টারফেস সরবরাহ করে। প্রক্সি একই ইন্টারফেস সরবরাহ করে। ডেকোরেটর একটি বর্ধিত ইন্টারফেস সরবরাহ করে।
  2. অ্যাডাপ্টার একটি বস্তুর ইন্টারফেস পরিবর্তন করে, ডেকোরেটর একটি সামগ্রীর দায়িত্ব বাড়ায়।
  3. সাজসজ্জা এবং প্রক্সি বিভিন্ন উদ্দেশ্য কিন্তু একই কাঠামো আছে
  4. অ্যাডাপ্টার জিনিসগুলি ডিজাইন করার পরে কাজ করে তোলে; সেতু তাদের আগে তাদের কাজ করে তোলে।
  5. ব্রিজটি আপ-ফ্রন্টটি ডিজাইন করা হয়েছে যাতে বিমূর্তি প্রয়োগ এবং প্রয়োগটি স্বতন্ত্রভাবে পরিবর্তিত হয়। এডাপটারসম্পর্কিত না হওয়া ক্লাসগুলি একসাথে কাজ করতে পুনঃনির্মাণযোগ্য
  6. প্রসাধক আপনাকে সাবক্লাসিং ছাড়াই অবজেক্টগুলিতে দায়িত্ব যুক্ত করতে দেওয়ার জন্য ডিজাইন করা হয়েছে।

বিভিন্ন নকশার নিদর্শনগুলির উদাহরণ সম্পর্কে দুর্দান্ত এসই প্রশ্ন / নিবন্ধগুলি দেখুন

সজ্জিত প্যাটার্ন কখন ব্যবহার করবেন?

আপনি কখন ব্রিজ প্যাটার্ন ব্যবহার করবেন? এটি অ্যাডাপ্টারের প্যাটার্ন থেকে কীভাবে আলাদা?

প্রক্সি এবং ডেকরেটর প্যাটার্নের মধ্যে পার্থক্য


8

তারা বেশ অনুরূপ, এবং তাদের মধ্যে লাইনগুলি বেশ ধূসর। আমি আপনাকে সি 2 উইকিতে প্রক্সি প্যাটার্ন এবং ডেকোরেটর প্যাটার্ন এন্ট্রি পড়ার পরামর্শ দিচ্ছি ।

সেখানকার এন্ট্রি এবং আলোচনাগুলি বেশ বিস্তৃত এবং এগুলি অন্যান্য প্রাসঙ্গিক নিবন্ধগুলির সাথেও লিঙ্ক করে। উপায় দ্বারা, বিভিন্ন নিদর্শনগুলির মধ্যে সূক্ষ্মতার বিষয়ে ভাবতে ভাবতে সি 2 উইকিটি দুর্দান্ত।

সি 2 এন্ট্রিগুলির সংক্ষিপ্তসার হিসাবে, আমি বলতে পারি যে কোনও ডেকরেটর আচরণ / পরিবর্তনগুলি যুক্ত করে, তবে অ্যাক্সেস নিয়ন্ত্রণ (অলস তাত্ক্ষণিকণ, দূরবর্তী অ্যাক্সেস, সুরক্ষা ইত্যাদি) এর সাথে একটি প্রক্সি আরও অনেক কিছু করতে পারে। তবে আমি যেমন বলেছি, তাদের মধ্যে লাইনগুলি ধূসর, এবং আমি প্রক্সিগুলির উল্লেখ দেখতে পাই যা সহজেই সজ্জিত এবং বিপরীত হিসাবে দেখা যেতে পারে।


4

চারটি নিদর্শনগুলির মধ্যে সমস্তটি বাইরের সাথে আভ্যন্তরীণ বস্তু / শ্রেণি মোড়ানো জড়িত, সুতরাং এগুলি কাঠামোগতভাবে খুব অনুরূপ। আমি উদ্দেশ্য দ্বারা পার্থক্যের রূপরেখা করব:

  • প্রক্সি বাইরের থেকে অভ্যন্তরে অ্যাক্সেসকে আবদ্ধ করে।
  • সাজসজ্জার বহিরাগত সঙ্গে অভ্যন্তরের আচরণ পরিবর্তন করে বা প্রসারিত করে।
  • অ্যাডাপ্টার ইন্টারফেসকে অভ্যন্তরীণ থেকে বাইরের দিকে রূপান্তর করে।
  • সেতু আচরণের অদম্য অংশ (বহিরাগত) পরিবর্তনশীল বা প্ল্যাটফর্ম-নির্ভর অংশ (অভ্যন্তরীণ) থেকে পৃথক করে।

এবং অভ্যন্তরীণ এবং বাহ্যিক বস্তুর মধ্যে ইন্টারফেসের পার্থক্য দ্বারা:

  • মধ্যে প্রক্সি ইন্টারফেসগুলি একই।
  • মধ্যে প্রসাধক ইন্টারফেসগুলি একই।
  • মধ্যে অ্যাডাপ্টার ইন্টারফেসগুলি আনুষ্ঠানিকভাবে আলাদা, কিন্তু একই উদ্দেশ্য পূর্ণ করা।
  • মধ্যে সেতু ইন্টারফেসগুলি ধারণার দিক থেকে ভিন্ন।

4

এটি হেড ফার্স্ট ডিজাইন প্যাটার্নসের উদ্ধৃতি

সংজ্ঞা বইয়ের অন্তর্গত। উদাহরণগুলি আমার।

সাজসজ্জা - ইন্টারফেস পরিবর্তন করে না, তবে দায়িত্ব যুক্ত করে adds ধরে নিন আপনার কাছে একটি গাড়ী ইন্টারফেস রয়েছে, যখন আপনি গাড়িটির বিভিন্ন মডেলের (গুলি, এসভি, এসএল) এর জন্য এটি প্রয়োগ করেন আপনার আরও দায়িত্ব যুক্ত করতে হবে কিছু মডেলের জন্য । যেমন সানরুফ, এয়ারব্যাগ ইত্যাদি রয়েছে ..

অ্যাডাপ্টার - একটি ইন্টারফেসকে অন্যটিতে রূপান্তর করে। আপনার একটি গাড়ী ইন্টারফেস রয়েছে এবং আপনি এটি জিপের মতো কাজ করতে চান। সুতরাং আপনি গাড়িটি নিয়ে যান, এটি পরিবর্তন করুন এবং একটি জিপে পরিণত করুন turn যেহেতু এটি আসল জিপ নয়। তবে জিপের মতো কাজ করে।

মুখোমুখি - একটি ইন্টারফেস সহজতর করে তোলে। ধরুন আপনার গাড়ি, বিমান, শিপ ইন্টারফেস রয়েছে। আসলে আপনার যা দরকার তা হ'ল এক শ্রেণি যা লোকদের এক অবস্থান থেকে অন্য জায়গায় পাঠায়। আপনি কোন গাড়িটি ব্যবহার করবেন তা স্থির করতে চান। তারপরে আপনি এই সমস্ত ইন্টারফেসের রেফারেন্সটি 1 টি ছাতার নীচে সংগ্রহ করেন এবং এটিকে সহজ রাখার জন্য সিদ্ধান্ত / প্রতিনিধি দেওয়ার অনুমতি দিন।

প্রথম শিরোনাম: "একটি মুখোমুখি কেবল একটি ইন্টারফেসকে সহজতর করে না, এটি একটি ক্লায়েন্টকে উপাদানগুলির একটি সাবসিস্টেম থেকে ডিকুপল করে Fac "


1

ওয়েব পরিষেবাগুলি গ্রাস করার সময় আমি এটি প্রায়শই ব্যবহার করি। প্রক্সি প্যাটার্নটি সম্ভবত সম্ভবত আরও ব্যবহারিক কিছুতে নামকরণ করা উচিত, যেমন 'র্যাপার প্যাটার্ন "। আমার কাছে একটি লাইব্রেরি রয়েছে যা এমএস এক্সেলের একটি প্রক্সি It সংস্করণ ইনস্টল করা (যদি থাকে)।


এটি কি কেবল অ্যাডাপ্টার প্যাটার্ন হবে না?
চার্লস গ্রাহাম

1
একটি ওয়েব পরিষেবা একটি প্রক্সি দ্বারা গ্রাস করা হয়, যেখানে অ্যাডাপ্টার প্যাটার্নটি এক রূপ থেকে অন্য রূপে ডেটা রূপান্তর বা অনুবাদ করার জন্য বেশি ব্যবহৃত হয়।
hmcclungiii

1

বিশদ প্রয়োগের কথা বললে আমি প্রক্সি এবং ডেকরেটর, অ্যাডাপ্টার, ফ্যাসাদের মধ্যে পার্থক্য দেখতে পাই ... এই নিদর্শনগুলির সাধারণ বাস্তবায়নে একটি সংলগ্ন বস্তু দ্বারা আবৃত একটি লক্ষ্য বস্তু রয়েছে। ক্লায়েন্ট লক্ষ্য বস্তুর পরিবর্তে এনকোলেজিং অবজেক্ট ব্যবহার করে। এবং লক্ষ্য বস্তুটি আসলে ঘেরানো বস্তুর কয়েকটি পদ্ধতির অভ্যন্তরে একটি গুরুত্বপূর্ণ ভূমিকা পালন করে।

যাইহোক, প্রক্সি ক্ষেত্রে, ঘেরযুক্ত বস্তু নিজে থেকে কিছু পদ্ধতি খেলতে পারে, ক্লায়েন্ট যখন এমন কিছু পদ্ধতিতে কল করে যে লক্ষ্য অবজেক্টে অংশ নিতে পারে তখন এটি কেবলমাত্র লক্ষ্য বস্তুটি আরম্ভ করে This এটি অলস সূচনা। অন্যান্য নিদর্শনগুলির ক্ষেত্রে, ঘেরযুক্ত বস্তুটি কার্যত লক্ষ্য বস্তুর উপর ভিত্তি করে। সুতরাং টার্গেট অবজেক্টটি সর্বদা কনস্ট্রাক্টর / সেটারগুলিতে এনক্লোজিং অবজেক্টের পাশাপাশি শুরু করা হয়।

আরেকটি বিষয়, একটি প্রক্সি লক্ষ্য হিসাবে ঠিক কী করে সেখানে অন্য নিদর্শনগুলি লক্ষ্যগুলিতে আরও কার্যকারিতা যুক্ত করে।


1

আমি বিল কারিংয়ের উত্তরের উদাহরণগুলি যোগ করতে চাই (যা দুর্দান্ত বিটিডাব্লু)) আমি বাস্তবায়নের কয়েকটি মূল পার্থক্যও যুক্ত করছি, যা আমার মনে হচ্ছে অনুপস্থিত

উদ্ধৃত অংশগুলি [ https://stackoverflow.com/a/350471/1984346] (বিল কারুইং) এর উত্তর থেকে এসেছে

প্রক্সি, ডেকোরেটর, অ্যাডাপ্টার এবং ব্রিজ একটি শ্রেণি "মোড়ানোর" ক্ষেত্রে সমস্ত প্রকারভেদ। তবে তাদের ব্যবহার আলাদা।

  • আপনি যখন কোনও বস্তুকে অলস-ইনস্ট্যান্টিয়েট করতে চান বা আপনি কোনও দূরবর্তী পরিষেবাটি কল করছেন বা অবজেক্টে অ্যাক্সেস নিয়ন্ত্রণ করতে চান তখন প্রক্সি ব্যবহার করা যেতে পারে।

প্রক্সি ক্লাস এবং অবজেক্টক্লাস যা প্রক্সড রয়েছে, তাদের একই ইন্টারফেস প্রয়োগ করা উচিত, সুতরাং সেগুলি বিনিময়যোগ্য

উদাহরণ - প্রক্সি ব্যয়বহুল অবজেক্ট

class ProxyHumanGenome implements GenomeInterface  {
    private $humanGenome = NULL; 

    // humanGenome class is not instantiated at construct time
    function __construct() {
    }

    function getGenomeCount() {
        if (NULL == $this->humanGenome) {
            $this->instantiateGenomeClass(); 
        }
        return $this->humanGenome->getGenomeCount();
    }
} 
class HumanGenome implement GenomeInterface { ... }
  • সাজসজ্জারকে "স্মার্ট প্রক্সি "ও বলা হয়। আপনি যখন কোনও বস্তুতে কার্যকারিতা যুক্ত করতে চান তবে এটি ব্যবহার করা হয় তবে সেই বস্তুর প্রকারটি প্রসারিত করে নয়। এটি রানটাইমে আপনাকে এটি করতে দেয়।

ডেকোরেটর ক্লাস অবজেক্টক্লাসের বর্ধিত ইন্টারফেস প্রয়োগ করতে (পারে) should সুতরাং অবজেক্টক্লাসটি ডেকোরেটর ক্লাস দ্বারা প্রতিস্থাপন করা যেতে পারে তবে বিপরীতে নয়।

উদাহরণ - সংযোজন কার্যকারিতা যুক্ত করা

class DecoratorHumanGenome implements CheckGenomeInterface  {

    // ... same code as previous example

    // added functionality
    public function isComplete() {
        $this->humanGenome->getCount >= 21000
    }
}

interface CheckGenomeInterface extends GenomeInterface {

    public function isComplete();

}

class HumanGenome implement GenomeInterface { ... }
  • অ্যাডাপ্টার ব্যবহার করা হয় যখন আপনার কোনও বিমূর্ত ইন্টারফেস থাকে এবং আপনি সেই ইন্টারফেসটিকে অন্য কোনও অবজেক্টে ম্যাপ করতে চান যার অনুরূপ কার্যকরী ভূমিকা রয়েছে তবে ভিন্ন ইন্টারফেস।

ইমপ্লেশন পার্থক্য প্রক্সি, ডেকোরেটর, অ্যাডাপ্টার

অ্যাডাপ্টার তার বিষয়টিকে আলাদা ইন্টারফেস সরবরাহ করে। প্রক্সি একই ইন্টারফেস সরবরাহ করে। ডেকোরেটর একটি বর্ধিত ইন্টারফেস সরবরাহ করে।

  • ব্রিজ অ্যাডাপ্টারের সাথে খুব সমান, তবে আপনি যখন অ্যাবস্ট্রাক্ট ইন্টারফেস এবং অন্তর্নিহিত বাস্তবায়ন উভয়টি সংজ্ঞায়িত করেন তখন আমরা এটিকে ব্রিজ বলি। অর্থাৎ আপনি কিছু উত্তরাধিকার বা তৃতীয় পক্ষের কোডের সাথে মানিয়ে নিচ্ছেন না, আপনি সমস্ত কোডের ডিজাইনার তবে আপনার বিভিন্ন রূপায়ণ পরিবর্তন করতে সক্ষম হতে হবে।

  • ফেকাড হ'ল এক বা একাধিক শ্রেণীর সাবসিস্টেমের একটি উচ্চ-স্তরের (পড়ুন: সহজ) ইন্টারফেস। ধরুন আপনার একটি জটিল ধারণা রয়েছে যার প্রতিনিধিত্ব করার জন্য একাধিক বস্তুর প্রয়োজন। অবজেক্টের সেটে পরিবর্তন করা বিভ্রান্তিকর, কারণ আপনি সর্বদা জানেন না যে কোন বস্তুর জন্য আপনার কল করার পদ্ধতি রয়েছে। আপনি অবজেক্ট সংগ্রহের জন্য যে জটিল জটিল ক্রিয়াকলাপগুলি করতে পারেন তার জন্য উচ্চ-স্তরের পদ্ধতি সরবরাহ করে এমন একটি ফ্যাসেড লেখার সময়। উদাহরণ: একটি স্কুল অধ্যায় জন্য একটি ডোমেন মডেল, মত পদ্ধতি countStudents(), reportAttendance(), assignSubstituteTeacher(), ইত্যাদি।

এই উত্তরের বেশিরভাগ তথ্য https://sourcemaking.com/design_patterns থেকে , যা আমি নকশার নিদর্শনগুলির জন্য একটি দুর্দান্ত উত্স হিসাবে সুপারিশ করি ।


0

আমি বিশ্বাস করি কোড একটি পরিষ্কার ধারণা দেবে (অন্যদের উত্তরগুলির পরিপূরক হিসাবেও)। দয়া করে নীচে দেখুন, (কোনও শ্রেণি প্রয়োগ করে এবং মোড়কে দেয় এমন ফোকাসগুলি)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            /* Proxy */

            Console.WriteLine(Environment.NewLine);
            Console.WriteLine("PROXY");
            Console.WriteLine(Environment.NewLine);

            //instead of creating here create using a factory method, the facory method will return the proxy
            IReal realProxy = new RealProxy();
            Console.WriteLine("calling do work with the proxy object ");
            realProxy.DoWork();

            Console.WriteLine(Environment.NewLine);
            Console.WriteLine("ADAPTER");
            Console.WriteLine(Environment.NewLine);

            /*Adapter*/
            IInHand objectIHave = new InHand();
            Api myApi = new Api();
            //myApi.SomeApi(objectIHave); /*I cant do this, use a adapter then */
            IActual myAdaptedObject = new ActualAdapterForInHand(objectIHave);
            Console.WriteLine("calling api with  my adapted obj");
            myApi.SomeApi(myAdaptedObject);


            Console.WriteLine(Environment.NewLine);
            Console.WriteLine("DECORATOR");
            Console.WriteLine(Environment.NewLine);

            /*Decorator*/
            IReady maleReady = new Male();
            Console.WriteLine("now male is going to get ready himself");
            maleReady.GetReady();

            Console.WriteLine(Environment.NewLine);

            IReady femaleReady = new Female();
            Console.WriteLine("now female is going to get ready her self");
            femaleReady.GetReady();

            Console.WriteLine(Environment.NewLine);

            IReady maleReadyByBeautician = new Beautician(maleReady);
            Console.WriteLine("now male is going to get ready by beautician");
            maleReadyByBeautician.GetReady();

            Console.WriteLine(Environment.NewLine);

            IReady femaleReadyByBeautician = new Beautician(femaleReady);
            Console.WriteLine("now female is going to get ready by beautician");
            femaleReadyByBeautician.GetReady();

            Console.WriteLine(Environment.NewLine);

            Console.ReadLine();


        }
    }

    /*Proxy*/

    public interface IReal
    {
        void DoWork();
    }

    public class Real : IReal
    {
        public void DoWork()
        {
            Console.WriteLine("real is doing work ");
        }
    }


    public class RealProxy : IReal
    {
        IReal real = new Real();

        public void DoWork()
        {
            real.DoWork();
        }
    }

    /*Adapter*/

    public interface IActual
    {
        void DoWork();
    }

    public class Api
    {
        public void SomeApi(IActual actual)
        {
            actual.DoWork();
        }
    }

    public interface IInHand
    {
        void DoWorkDifferently();
    }

    public class InHand : IInHand
    {
        public void DoWorkDifferently()
        {
            Console.WriteLine("doing work slightly different ");
        }
    }

    public class ActualAdapterForInHand : IActual
    {
        IInHand hand = null;

        public ActualAdapterForInHand()
        {
            hand = new InHand();
        }

        public ActualAdapterForInHand(IInHand hnd)
        {
            hand = hnd;
        }

        public void DoWork()
        {
            hand.DoWorkDifferently();
        }
    }

    /*Decorator*/

    public interface IReady
    {
        void GetReady();
    }

    public class Male : IReady
    {
        public void GetReady()
        {
            Console.WriteLine("Taking bath.. ");
            Console.WriteLine("Dress up....");
        }
    }

    public class Female : IReady
    {
        public void GetReady()
        {
            Console.WriteLine("Taking bath.. ");
            Console.WriteLine("Dress up....");
            Console.WriteLine("Make up....");
        }
    }

    //this is a decorator
    public class Beautician : IReady
    {
        IReady ready = null;

        public Beautician(IReady rdy)
        {
            ready = rdy;
        }

        public void GetReady()
        {
            ready.GetReady();
            Console.WriteLine("Style hair ");

            if (ready is Female)
            {
                for (int i = 1; i <= 10; i++)
                {
                    Console.WriteLine("doing ready process " + i);
                }

            }
        }
    }

}

-3

ডিজাইনের ধরণটি গণিত নয়, এটি শিল্প ও সফটওয়্যার ইঞ্জিনিয়ারিংয়ের সংমিশ্রণ। এই প্রয়োজনীয়তার জন্য আপনাকে প্রক্সি, সেতু ইত্যাদি ব্যবহার করতে হবে এমন কোনও সমস্যা নেই যা সমস্যার সমাধানের জন্য ডিজাইনের নিদর্শন তৈরি করা হয়। যদি আপনি কোনও ডিজাইনের সমস্যা অনুমান করেন তবে এটি ব্যবহার করুন। অভিজ্ঞতার ভিত্তিতে, আপনি নির্দিষ্ট সমস্যার জন্য, কোন প্যাটার্নটি ব্যবহার করবেন তা জানতে পারবেন। আপনি যদি সুনির্দিষ্ট ডিজাইনের নীতিগুলিতে ভাল হন তবে আপনি এটি নকশার ধরণটি না জেনে ডিজাইনের প্যাটার্ন প্রয়োগ করেছেন। সাধারণ উদাহরণ স্ট্যাটারজি এবং কারখানার নিদর্শন patterns

অতএব কঠিন ডিজাইনের নীতি, পরিষ্কার কোডিং নীতি এবং টিটিডিটিতে আরও মনোনিবেশ করুন


সম্মত হন, যদিও এটি প্রশ্নের জবাব দিচ্ছে না।
লিওন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.