টেম্পলেট পদ্ধতি এবং কৌশল নিদর্শন মধ্যে পার্থক্য কি?


161

টেমপ্লেট পদ্ধতি প্যাটার্ন এবং কৌশল প্যাটার্ন মধ্যে পার্থক্য কি দয়া করে কেউ আমাকে ব্যাখ্যা করতে পারেন?

যতদূর আমি বলতে পারি যে তারা 99% একই - একমাত্র পার্থক্য হ'ল টেমপ্লেট পদ্ধতি প্যাটার্নটিতে বেস ক্লাস হিসাবে একটি বিমূর্ত শ্রেণি রয়েছে যখন কৌশল ক্লাসটি একটি ইন্টারফেস ব্যবহার করে যা প্রতিটি কংক্রিট কৌশল শ্রেণীর দ্বারা প্রয়োগ করা হয়।

যাইহোক, ক্লায়েন্ট যতদূর উদ্বিগ্ন তারা ঠিক একইভাবে খাওয়া হয় - এটি কি সঠিক?


2
: তাই এই পোস্ট সম্পর্কে একই প্রশ্ন জন্য একটি ভাল উত্তর আছে stackoverflow.com/questions/464524/...
Gob00st

12
Gob00st প্রশ্নের সাথে যুক্ত হ'ল কৌশল এবং সেতুর পার্থক্য। এটি মোটেই এই প্রশ্নের উত্তর নয়।
ব্লুকিজ

উত্তর:


135

উভয়ের মধ্যে প্রধান পার্থক্য হ'ল যখন কংক্রিটের অ্যালগরিদম বেছে নেওয়া হয়।

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

class ConcreteAlgorithm : AbstractTemplate
{
    void DoAlgorithm(int datum) {...}
}

class AbstractTemplate
{
    void run(int datum) { DoAlgorithm(datum); }

    virtual void DoAlgorithm() = 0; // abstract
}

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

class ConcreteAlgorithm : IAlgorithm
{
    void DoAlgorithm(int datum) {...}
}

class Strategy
{
    Strategy(IAlgorithm algo) {...}

    void run(int datum) { this->algo.DoAlgorithm(datum); }
}

সংক্ষেপে:

  • টেম্পলেট পদ্ধতির প্যাটার্ন: সাবক্লাসিং করে সংকলন-সময় অ্যালগরিদম নির্বাচন
  • কৌশল নিদর্শন: রক্ষণাবেক্ষণ দ্বারা রান-টাইম অ্যালগরিদম নির্বাচন

47
উভয় নিদর্শন ব্যবহৃত অ্যালগরিদমের রানটাইম নির্বাচনকে সমর্থন করে (টেমপ্লেট পদ্ধতির জন্য, আপনি এমন কিছু করতে চাইবেন if (config.useAlgoA) impl = new AlgoA() else impl = new AlgoB()) যাতে এই উত্তরটি ভুল।
বোরেক বার্নার্ড

13
নিশ্চিত যে আপনি এটি করতে পারেন তবে তারপরে আপনি টেম্পলেট প্যাটার্নটি ব্যবহার করছেন না। আসলে, স্ট্র্যাটেজি উদাহরণ তৈরির কোডটি দেখতে প্রায় ঠিক একই রকম হবে!
হাউস

21
-1, আমি মনে করি এই উত্তরটি (যদিও সম্পূর্ণ ভুল নয়), যেখানে আসল পার্থক্য রয়েছে সেই বিন্দুটি মিস করে। @ টভানফসনের উত্তরটি আরও ভাল।
ডক ব্রাউন

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

1
উভয় নিদর্শন জন্য একটি কংক্রিট অ্যালগরিদম একইভাবে চয়ন করা হয়। new ConcreteAlgorithm1()বনাম বনাম দ্বারা পছন্দ করা হয় new ConcreteAlgorithm2()। স্পষ্টতই পছন্দটি রানটাইমের সময়ে ঘটে (সংকলনের সময় একটি অ্যালগরিদম পছন্দ করা মানে এটি হার্ড-কোডিং)। উভয়ের মধ্যে প্রধান পার্থক্য হ'ল কীভাবে কংক্রিটের অ্যালগরিদম প্রয়োগ করা হয়। এটি কি সাবক্লাস হিসাবে বা পৃথক ইন্টারফেস হিসাবে প্রয়োগ করা হয়েছে? পূর্ববর্তীটি একটি টেম্পলেট। পরেরটি একটি কৌশল। পার্থক্যটি সংশ্লেষ বনাম উত্তরাধিকার হিসাবে সংক্ষিপ্ত করা যেতে পারে, যা জিওএফ বইয়ের একটি সাধারণ থিম।
jaco0646

138

টেমপ্লেট প্যাটার্নটি ব্যবহৃত হয় যখন নির্দিষ্ট ক্রিয়াকলাপে কিছু আক্রমণাত্মক আচরণ থাকে (যা) অন্যান্য ভিন্ন ভিন্ন আদিম আচরণের ক্ষেত্রে সংজ্ঞায়িত করা যায়। বিমূর্ত শ্রেণি আক্রমণকারী আচরণ (গুলি) সংজ্ঞায়িত করে, যখন বাস্তবায়নকারী ক্লাসগুলি নির্ভরশীল পদ্ধতিগুলি সংজ্ঞায়িত করে।

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

দুটি নিদর্শন সহজেই একসাথে ব্যবহার করা যেতে পারে। আপনার একটি কৌশল প্যাটার্ন থাকতে পারে যেখানে বেশ কয়েকটি বাস্তবায়ন কোনও টেমপ্লেট প্যাটার্ন ব্যবহার করে প্রয়োগ করা কৌশলগুলির পরিবারের অন্তর্ভুক্ত।


এটি আমার কাছে ঠিক মনে হয়, তবে উইকিপিডিয়া কেন উল্লেখ করে যে "কৌশল সময়টি রানওয়েতে নির্বাচিত হওয়ার জন্য অ্যালগরিদমের আচরণের জন্য"? এটি সংকলন সময়ে অ্যালগরিদমের আচরণ নির্বাচন করার জন্যও ব্যবহার করা যেতে পারে, যেমন টেম্পলেট পদ্ধতির মতো? আমি কিছু অনুপস্থিত করছি?
বোর্নটোকোড

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

হ্যাঁ, তবে কৌশল প্যাটার্নটি কেবল এই ক্ষেত্রে ব্যবহার করা উচিত নয়? আমি বোঝাতে চাইছি যে কম্পাইল করার সময় যদি আমাকে কেবল অ্যালগরিদমের আচরণ নির্বাচন করা দরকার তখনও আমার কী কৌশল কৌশলটি ব্যবহার করা উচিত, বা এটি সেভাবে ব্যবহার করা বোঝানো হয়নি?
অক্টোবর

1
@ বার্নটোকোড আমি বলব যখন পছন্দটি গতিশীল হয় তখন কৌশলটি সবচেয়ে কার্যকর। টেমপ্লেট মূলত পরিচিত, পরিচিত সম্পর্কিত বিভিন্ন, সম্পর্কিত আচরণ তৈরির একটি উপায়। আপনি কোন কৌশলগত আচরণ ব্যবহার করবেন তা বেছে নেওয়ার জন্য কিছু কৌশল (যদিও প্রয়োজনীয় কৌশল কৌশল হিসাবে নয়) ব্যবহার করতে চাই। উদাহরণস্বরূপ, পণ্যের উত্তরাধিকার - আপনি একটি বেস পণ্য তৈরি করতে চান, বিভিন্ন পণ্যের জন্য বৈশিষ্ট্য যুক্ত করুন। কোন পণ্যের ধরণ (শ্রেণি) ইনস্ট্যান্ট করতে হবে তা কোন টেবিল / দর্শনগুলি থেকে লোড হয়েছে তার উপর নির্ভর করে। কৌশল প্যাটার্ন সত্যিই সেখানে প্রয়োগ হয় না।
tvanfosson

2
@ বার্নটোকোড এটি কোনও একটি / বা জিনিস নয়, এটি হ্যাঁ এবং। এটি উপযুক্ত যেখানে প্যাটার্নটি প্রয়োগ করুন, যেখানে দরকারী সেগুলি একত্র করুন।
tvanfosson

26

আমি মনে করি উভয় প্যাটার্নের ক্লাস-ডায়াগ্রামগুলি পার্থক্য দেখাচ্ছে।

কৌশল চিত্রের সাথে
একটি শ্রেণীর লিঙ্কের মধ্যে একটি অ্যালগোরিদমকে encapsulates
এখানে চিত্র বর্ণনা লিখুন

টেমপ্লেট পদ্ধতি চিত্রের
সাথে একটি সাবক্লাসের লিঙ্কে অ্যালগরিদমের সঠিক পদক্ষেপগুলি স্থির
করুন এখানে চিত্র বর্ণনা লিখুন


24

আপনি সম্ভবত টেমপ্লেট পদ্ধতি প্যাটার্ন বলতে চাইছেন। আপনি ঠিক বলেছেন, তারা খুব অনুরূপ প্রয়োজন পরিবেশন করে। আমি বলব যে ক্ষেত্রে যখন আপনার কাছে "টেমপ্লেট" অ্যালগরিদম সংজ্ঞায়িত পদক্ষেপ রয়েছে যেখানে সাবক্লাসগুলি কিছু বিবরণ পরিবর্তন করতে এই পদক্ষেপগুলিকে ওভাররাইড করে সেখানে ক্ষেত্রে টেমপ্লেট পদ্ধতিটি ব্যবহার করা ভাল। কৌশল ক্ষেত্রে, আপনার একটি ইন্টারফেস তৈরি করা প্রয়োজন, এবং উত্তরাধিকারের পরিবর্তে আপনি প্রতিনিধি ব্যবহার করছেন। আমি বলব এটি কিছুটা শক্তিশালী প্যাটার্ন এবং ডিআইপি - নির্ভরতা বিপরীত নীতি অনুসারে আরও ভাল। এটি আরও শক্তিশালী কারণ আপনি কৌশলটির একটি নতুন বিমূর্ততা পরিষ্কারভাবে সংজ্ঞায়িত করেছেন - এমন কিছু করার একটি উপায়, যা টেম্পলেট পদ্ধতিতে প্রযোজ্য নয়। সুতরাং, যদি এই বিমূর্ততাটি বোঝায় - এটি ব্যবহার করুন। যাইহোক, টেমপ্লেট পদ্ধতিটি ব্যবহার করা আপনাকে সাধারণ ক্ষেত্রে সহজ ডিজাইন দিতে পারে, এটিও গুরুত্বপূর্ণ। কোন শব্দগুলি আরও ভাল ফিট করে তা বিবেচনা করুন: আপনার কি কোনও টেম্পলেট অ্যালগরিদম আছে? বা আপনার কাছে কৌশলটির বিমূর্ততা রয়েছে - এখানে কিছু করার নতুন উপায় the

একটি টেম্পলেট পদ্ধতির উদাহরণ:

Application.main()
{
Init();
Run();
Done();
}

এখানে আপনি অ্যাপ্লিকেশন থেকে উত্তরাধিকারী এবং প্রাথমিকভাবে কী করা হবে তা চালান, চালানো এবং সম্পন্ন করা।

একটি কৌশল উদাহরণ:

array.sort (IComparer<T> comparer)

এখানে, তুলনামূলক লেখার সময় আপনি কোনও অ্যারে থেকে উত্তরাধিকারী হন না। অ্যারে তুলনামূলক অ্যালগরিদমকে একজন তুলনাকারীর প্রতিনিধিত্ব করে।


3
আমি মনে করি এটি দুর্দান্ত উত্তর
কল্যানাস

23

কৌশল এবং টেম্পলেট পদ্ধতি প্যাটার্ন কৌশল বনাম টেম্পলেট পদ্ধতির মধ্যে পার্থক্য


মিল

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


পার্থক্য

এই দুটি নিদর্শন অধ্যয়ন করার সময় আমি কিছু পার্থক্য লক্ষ্য করেছি:

  1. কৌশলতে, ক্লায়েন্ট এবং কৌশলগুলির মধ্যে সংযোগ আরও আলগা হয় যেখানে টেম্পলেট পদ্ধতিতে দুটি মডিউল আরও দৃ tight়ভাবে সংযুক্ত হয়।
  2. কৌশল হিসাবে, বেশিরভাগ ক্ষেত্রে একটি ইন্টারফেস ব্যবহৃত হয় যদিও অ্যাবস্ট্রাক্ট শ্রেণি পরিস্থিতি অনুসারে ব্যবহার করা যেতে পারে, এবং কংক্রিট শ্রেণি ব্যবহার করা হয় না যদিও টেম্পলেট পদ্ধতিতে বেশিরভাগ বিমূর্ত শ্রেণি বা কংক্রিট শ্রেণি ব্যবহৃত হয়, ইন্টারফেস ব্যবহার হয় না।
  3. কৌশল প্যাটার্নে, সাধারণভাবে শ্রেণীর পুরো আচরণ একটি ইন্টারফেসের ক্ষেত্রে প্রতিনিধিত্ব করা হয়, অন্যদিকে, টেম্পলেট পদ্ধতিটি কোড নকলকে হ্রাস করার জন্য ব্যবহৃত হয় এবং বয়লারপ্লেট কোডটি বেস কাঠামো বা বিমূর্ত শ্রেণিতে সংজ্ঞায়িত করা হয়। টেমপ্লেট পদ্ধতিতে, এমনকি ডিফল্ট বাস্তবায়ন সহ একটি কংক্রিট বর্গ থাকতে পারে।
  4. সহজ কথায়, আপনি কৌশল পদ্ধতিতে সম্পূর্ণ কৌশল (অ্যালগরিদম) পরিবর্তন করতে পারেন, তবে, টেমপ্লেট পদ্ধতিতে কেবল কিছু জিনিস পরিবর্তিত হয় (অ্যালগোরিদমের অংশ) এবং বাকী জিনিসগুলি অপরিবর্তিত থাকে। টেম্পলেট পদ্ধতিতে, আক্রমণকারী পদক্ষেপগুলি একটি বিমূর্ত বেস শ্রেণিতে প্রয়োগ করা হয়, যখন বৈকল্পিক পদক্ষেপগুলি হয় একটি ডিফল্ট বাস্তবায়ন দেওয়া হয়, বা মোটেও বাস্তবায়ন হয় না। টেম্পলেট পদ্ধতিতে, উপাদান ডিজাইনার একটি অ্যালগরিদমের প্রয়োজনীয় পদক্ষেপগুলি এবং পদক্ষেপগুলির ক্রমকে আদেশ দেয় তবে উপাদান উপাদানটি ক্লায়েন্টকে এই ধাপগুলির কয়েকটি সংখ্যা প্রসারিত বা প্রতিস্থাপন করতে দেয়।

কামড়যুক্ত ব্লগ থেকে ছবিটি নেওয়া হয়েছে ।


19

উত্তরাধিকার বনাম সমষ্টি (এটি হ'ল একটি-এর বিপরীতে)। এটি একই লক্ষ্য অর্জনের দুটি উপায়।

এই প্রশ্নটি পছন্দগুলির মধ্যে কিছু বাণিজ্য-অফ দেখায়: উত্তরাধিকার বনাম সমষ্টি


11

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

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

ক্লায়েন্ট কোডটি অ্যাবস্ট্রাক্ট শ্রেণীর ধরণের রেফারেন্স / পয়েন্টার ব্যবহার করে টেমপ্লেট পদ্ধতিতে কল দেয় যা কংক্রিট সাব ক্লাসগুলির মধ্যে একটির উদাহরণ হিসাবে নির্দেশ করে যা কৌশল সময়ে যেমন প্যাটার্ন ব্যবহার করার সময় চালানোর সময় নির্ধারণ করা যায়।


9

টেম্পলেট পদ্ধতি:

  1. এটি উত্তরাধিকারের ভিত্তিতে
  2. অ্যালগরিদমের কঙ্কাল সংজ্ঞায়িত করে যা উপ শ্রেণী দ্বারা পরিবর্তন করা যায় না। কেবলমাত্র সাব-ক্লাসগুলিতে নির্দিষ্ট ক্রিয়াকলাপগুলি ওভাররাইড করা যায়
  3. অভিভাবক শ্রেণি সম্পূর্ণরূপে অ্যালগরিদম নিয়ন্ত্রণ করে এবং কংক্রিট শ্রেণিতে কেবলমাত্র কয়েকটি পদক্ষেপের থেকে পৃথক হয়
  4. বাঁধাই সংকলন সময়ে করা হয়

টেমপ্লেট_মোথড কাঠামো:

এখানে চিত্র বর্ণনা লিখুন

কৌশল:

  1. এটি প্রতিনিধি / রচনার ভিত্তিতে
  2. এটি পদ্ধতির আচরণ পরিবর্তন করে অবজেক্টের সাহসকে পরিবর্তন করে
  3. এটি অ্যালগোরিদমের পরিবারের মধ্যে পরিবর্তন করতে ব্যবহৃত হয়
  4. এটি রান সময় সময়ে একটি অ্যালগরিদম সম্পূর্ণরূপে অন্যান্য অ্যালগরিদমের সাথে প্রতিস্থাপিত করে রানের সময় অবজেক্টের আচরণ পরিবর্তন করে
  5. বাঁধাই রান সময় করা হয়

কৌশল কাঠামো:

এখানে চিত্র বর্ণনা লিখুন

কটাক্ষপাত আছে টেমপ্লেট পদ্ধতি এবং কৌশল ভাল বোঝার জন্য নিবন্ধ।

সম্পর্কিত পোস্ট:

জেডিকে টেমপ্লেট ডিজাইনের প্যাটার্ন, ক্রমে কার্যকর করার জন্য পদ্ধতিগুলির সেট নির্ধারণ করার মতো কোনও পদ্ধতি খুঁজে পেল না

কৌশল প্যাটার্ন রিয়েল ওয়ার্ল্ড উদাহরণ


3

না, তারা অগত্যা একইভাবে খাওয়া হয় না। "টেম্পলেট পদ্ধতি" প্যাটার্ন হ'ল ভবিষ্যতের প্রয়োগকারীদের "নির্দেশিকা" সরবরাহ করার একটি উপায়। আপনি তাদের বলছেন, "সমস্ত ব্যক্তির সামগ্রীতে অবশ্যই একটি সামাজিক সুরক্ষা নম্বর থাকতে হবে" (এটি একটি তুচ্ছ উদাহরণ হলেও এটি সঠিকভাবে ধারণাটি পায়) gets

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

সুতরাং, কখনও কখনও, ক্লায়েন্ট প্রকৃতপক্ষে কোন কৌশলটি ব্যবহার করতে হবে তা অবজেক্টকে বলবে। হিসাবে হিসাবে

myShippingCalculator.CalculateTaxes(myCaliforniaSalesTaxImpl);

টেক্সট মেথডের ভিত্তিতে থাকা কোনও বস্তুর জন্য ক্লায়েন্ট কখনই এটি করতে পারে না। আসলে, ক্লায়েন্ট এমনকি কোনও বস্তু টেম্পলেট পদ্ধতিতে ভিত্তি করে তা জানেন না। টেমপ্লেট পদ্ধতি প্যাটার্নে থাকা এই বিমূর্ত পদ্ধতিগুলি এমনকি সুরক্ষিত হতে পারে, সেই ক্ষেত্রে ক্লায়েন্ট এমনকি তাদের अस्तित्व জানেন না।


3

আমি আপনাকে এই নিবন্ধটি পড়ার পরামর্শ দিচ্ছি । এটি একটি বাস্তব ক্ষেত্রে উদাহরণ পার্থক্য ব্যাখ্যা করে।

নিবন্ধ থেকে উদ্ধৃতি

" যেহেতু কেউ দেখতে পাচ্ছে বাস্তবায়নকারী ক্লাসগুলিও টেম্পলেট পদ্ধতি শ্রেণীর উপর নির্ভর করে one ক্লাসগুলি সম্পূর্ণরূপে একটি অ্যালগরিদম সংজ্ঞায়িত করতে হয় সুতরাং কোনও পরিবর্তন যদি আসে তবে পূর্বের লিখিত ক্লাসগুলির কোড পরিবর্তন করা দরকার This এটি ক্লাসগুলি ডিজাইনের জন্য কৌশল বেছে নেওয়ার প্রাথমিক কারণ ছিল।

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

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

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


2

টেমপ্লেট প্যাটার্ন কৌশল প্যাটার্নের মতো। এই দুটি নিদর্শন সুযোগ এবং পদ্ধতিতে পৃথক হয়।

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

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

http://cyruscrypt.blogspot.com/2005/07/template-vs-strategy-patterns.html থেকে


2

কৌশল নকশায় সাবক্লাসগুলি শো চালাচ্ছে এবং তারা অ্যালগরিদম নিয়ন্ত্রণ করে। এখানে কোডটি সাবক্লাসে নকল করা হয়েছে। অ্যালগরিদমের জ্ঞান এবং কীভাবে এটি প্রয়োগ করা যায় তা বিভিন্ন শ্রেণিতে বিতরণ করা হয়।

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


2

কৌশল নকশা প্যাটার্ন

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

টেমপ্লেট পদ্ধতি ডিজাইনের প্যাটার্ন

  • রচনা ওভার উত্তরাধিকার
  • আপনার বেস শ্রেণিতে অ্যালগরিদম সংজ্ঞায়িত করুন। পৃথক পৃথক পৃথক অ্যালগরিদম শিশু শ্রেণিতে কাস্টমাইজ করা যায়।

1

টেম্পলেট প্যাটার্ন:

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

public abstract class RobotTemplate {
    /* This method can be overridden by a subclass if required */
    public void start() {
        System.out.println("Starting....");
    }

    /* This method can be overridden by a subclass if required */
    public void getParts() {
        System.out.println("Getting parts....");
    }

    /* This method can be overridden by a subclass if required */
    public void assemble() {
        System.out.println("Assembling....");
    }

    /* This method can be overridden by a subclass if required */
    public void test() {
        System.out.println("Testing....");
    }

    /* This method can be overridden by a subclass if required */
    public void stop() {
        System.out.println("Stopping....");
    }

    /*
     * Template algorithm method made up of multiple steps, whose structure and
     * order of steps will not be changed by subclasses.
     */
    public final void go() {
        start();
        getParts();
        assemble();
        test();
        stop();
    }
}


/* Concrete subclass overrides template step methods as required for its use */
public class CookieRobot extends RobotTemplate {
    private String name;

    public CookieRobot(String n) {
        name = n;
    }

    @Override
    public void getParts() {
        System.out.println("Getting a flour and sugar....");
    }

    @Override
    public void assemble() {
        System.out.println("Baking a cookie....");
    }

    @Override
    public void test() {
        System.out.println("Crunching a cookie....");
    }

    public String getName() {
        return name;
    }
}

উপরের কোডটিতে নোট করুন, গো () অ্যালগরিদম পদক্ষেপ সবসময় একই থাকবে তবে উপক্লাসগুলি একটি নির্দিষ্ট পদক্ষেপ সম্পাদনের জন্য আলাদা রেসিপিটি সংজ্ঞায়িত করতে পারে।

কৌশল প্যাটার্ন:

কৌশল প্যাটার্নটি ক্লায়েন্টকে রানটাইমের সময় কংক্রিট অ্যালগরিদম বাস্তবায়ন করতে দেয়। সমস্ত অ্যালগোরিদম বিচ্ছিন্ন এবং স্বতন্ত্র, তবে একটি সাধারণ ইন্টারফেস প্রয়োগ করে এবং অ্যালগরিদমের মধ্যে নির্দিষ্ট পদক্ষেপগুলি নির্ধারণ করার কোনও ধারণা নেই।

/**
 * This Strategy interface is implemented by all concrete objects representing an
 * algorithm(strategy), which lets us define a family of algorithms.
 */
public interface Logging {
    void write(String message);
}

/**
 * Concrete strategy class representing a particular algorithm.
 */
public class ConsoleLogging implements Logging {

    @Override
    public void write(String message) {
        System.out.println(message); 
    }

}

/**
 * Concrete strategy class representing a particular algorithm.
 */
public class FileLogging implements Logging {

    private final File toWrite;

    public FileLogging(final File toWrite) {
        this.toWrite = toWrite;
    }

    @Override
    public void write(String message) {
        try {
            final FileWriter fos = new FileWriter(toWrite);
            fos.write(message);
            fos.close();
        } catch (IOException e) {
            System.out.println(e);
        }
    }

}

সম্পূর্ণ উত্স কোডের জন্য, আমার গিথুব সংগ্রহস্থলটি পরীক্ষা করে দেখুন ।


0

কৌশলটি একটি ইন্টারফেস এবং বিমূর্ত শ্রেণির হিসাবে টেম্পলেট পদ্ধতি হিসাবে প্রকাশিত হয়। এটি সাধারণত ফ্রেমওয়ার্কগুলিতে প্রচুর ব্যবহৃত হয়। উদাহরণস্বরূপ স্প্রিং ফ্রেমওয়ার্কের ম্যাসেজসোর্স ক্লাসটি ম্যাসেজগুলি সমাধান করার জন্য একটি কৌশল ইন্টারফেস। ক্লায়েন্ট এই ইন্টারফেসের নির্দিষ্ট প্রয়োগ (কৌশল) ব্যবহার করে।

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

http://docs.spring.io/spring/docs/4.1.7.RELEASE/javadoc-api/org/springframework/context/support/AbstractMessageSource.html


0

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

প্যাটার্নের নাম টেম্পলেট পদ্ধতিটির অর্থ কী। বলুন আমাদের একটি পদ্ধতি ক্যালকুলেটসোমথিং () রয়েছে এবং আমরা এই পদ্ধতিটি টেম্পলেট করতে চাই। এই পদ্ধতিটি বেস শ্রেণিতে একটি অ ভার্চুয়াল পদ্ধতি হিসাবে ঘোষণা করা হবে। বলুন পদ্ধতিটি এমন দেখাচ্ছে।

CalculateSomething(){
    int i = 0;
    i = Step1(i);
    i++;
    if (i> 10) i = 5;
    i = Step2(i);
    return i;

} ধাপ 1 এবং ধাপ 2 পদ্ধতি বাস্তবায়িত ক্লাস দ্বারা দেওয়া যেতে পারে।

স্ট্র্যাটেজি প্যাটার্নে বেস দ্বারা সরবরাহ করা কোনও বাস্তবায়ন নেই (এই কারণটিই বর্গটি চিত্রের ভিত্তিটি সত্যই ইন্টারফেস)

ক্লাসিক উদাহরণ বাছাই করা হয়। অবজেক্টের সংখ্যার ভিত্তিতে যথাযথ অ্যালগরিদম শ্রেণি বাছাই করা প্রয়োজন (মার্জ, বুদ্বুদ, দ্রুত ইত্যাদি) তৈরি করা হয় এবং পুরো অ্যালগরিদম প্রতিটি শ্রেণিতেই encapsulated হয়।

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

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