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


96

আমি ওসিপি প্রিন্সিপাল এবং এটি কীভাবে কৌশল প্যাটার্নটি ব্যবহার করতে পারি সে সম্পর্কে পড়ছি ।

আমি কয়েকজনের কাছে এটির চেষ্টা এবং ব্যাখ্যা করতে যাচ্ছিলাম, তবে কেবলমাত্র একটি উদাহরণ যা আমি "অর্ডার" কী স্ট্যাটাসের ভিত্তিতে বিভিন্ন বৈধকরণের ক্লাস ব্যবহার করে তা ভাবতে পারি।

আমি অনলাইনে বেশ কয়েকটি নিবন্ধ পড়েছি, তবে এগুলি সাধারণত কৌশলটি ব্যবহার করার মতো প্রতিবেদন / বিল / বৈধতা ইত্যাদির মতো বাস্তব কারণের বর্ণনা দেয় না ...

এমন কোনও বাস্তব বিশ্বের উদাহরণ রয়েছে যেখানে আপনি মনে করেন কৌশল কৌশলটি সাধারণ?

উত্তর:


100

এই সম্পর্কে কি:

আপনাকে একটি ফাইল এনক্রিপ্ট করতে হবে।

ছোট ফাইলগুলির জন্য, আপনি "মেমোরিতে" কৌশলটি ব্যবহার করতে পারেন, যেখানে সম্পূর্ণ ফাইলটি পড়ে এবং মেমরিতে রাখা হয় (আসুন ফাইলগুলির জন্য বলুন <1 জিবি)

বড় ফাইলগুলির জন্য, আপনি অন্য কৌশলটি ব্যবহার করতে পারেন, যেখানে ফাইলের কিছু অংশ মেমরিতে পড়ে এবং আংশিক এনক্রিপ্ট করা ফলাফল tmp ফাইলগুলিতে সংরক্ষণ করা হয়।

এগুলি একই কাজের জন্য দুটি ভিন্ন কৌশল হতে পারে।

ক্লায়েন্ট কোড দেখতে একই রকম হবে:

 File file = getFile();
 Cipher c = CipherFactory.getCipher( file.size() );
 c.performAction();



// implementations:
interface  Cipher  {
     public void performAction();
}

class InMemoryCipherStrategy implements Cipher { 
         public void performAction() {
             // load in byte[] ....
         }
}

class SwaptToDiskCipher implements Cipher { 
         public void performAction() {
             // swapt partial results to file.
         }

}

দ্য

     Cipher c = CipherFactory.getCipher( file.size() );

সাইফারের জন্য সঠিক কৌশল উদাহরণটি ফিরিয়ে দেবে।

আশা করি এটা কাজে লাগবে.

(সিফার সঠিক শব্দ কিনা তা আমি জানি না: পি)


8
আপনার উদাহরণ কি আরও কারখানার নিদর্শন নয়? এছাড়াও আমি মনে করি এটি উদাহরণস্বরূপ সি # তে কাজ করবে না। আপনার "getCipher ()" পদ্ধতিটি একটি স্ট্যাটিক পদ্ধতি তবে সি # তে আপনি কোনও ইন্টারফেসে স্থির পদ্ধতিটি সংজ্ঞায়িত করতে পারবেন না (জাভাতেও আমি মনে করি না তবে এর জন্য আমি নিশ্চিত নই)।
ফ্রেঞ্চডাটা

10
তারা একসাথে যেতে। কারখানা কৌশলটি তৈরি করে, তবে কৌশলটি (মূলত) একই ক্রিয়াকলাপ সম্পাদন করার জন্য অ্যালগরিদমকে নিজের হাতে ধরে রাখে। রানটাইমে কৌশলও পরিবর্তন করা যেতে পারে। কারখানার পদ্ধতি সম্পর্কে আপনি সঠিক, আমি এটি পরিবর্তন করেছি।
অস্কাররাইজ

ওসাকার পয়েন্টে যোগ করার জন্য, কারখানা ছাড়াই এটি তৈরি করা যেতে পারে Cipher C =null; if (file.size() <= 2048) { C = new InMemoryCipherStrategy(); } else { c= SwaptToDiskCipher (); }
অভিজিৎ মজুমদার

@ ফ্রেঞ্চডাটার সাথে সম্মত হন একটি দুর্দান্ত উদাহরণ উপস্থিত থাকার সময় CipherFactoryকৌশল প্যাটার্নের সাথে পরিচিত নয় তাদের বিভ্রান্ত করতে পারে।
ব্যবহারকারী 487772

4
কারখানার নিদর্শন সৃজনশীল সম্পর্কে, কৌশলটি আচরণগত সম্পর্কে hav কিছুটা আলাদা আছে তো?
nhoxbypass

62

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

স্টাফ যা এই বিভাগে আসে:

  • বাছাই করা: আমরা এই নম্বরগুলি বাছাই করতে চাই, তবে আমরা জানি না যে আমরা ব্রিকসোর্ট, বাবলসোর্ট বা অন্য কোনও বাছাই করতে চাইছি কিনা

  • বৈধতা: আমাদের "কিছু নিয়ম" অনুসারে আইটেমগুলি পরীক্ষা করা দরকার, তবে সেই নিয়মটি কী হবে তা এখনও পরিষ্কার নয়, এবং আমরা নতুনগুলি সম্পর্কে ভাবতে পারি।

  • গেমস: আমরা খেলোয়াড়কে যেতে চাইলে সে হাঁটতে বা দৌড়াতে চাই, তবে ভবিষ্যতে হয়তো তার সাঁতার, উড়ন্ত, টেলিপোর্ট, ভূগর্ভস্থ বুড়ো ইত্যাদিও সক্ষম হওয়া উচিত maybe

  • তথ্য সংরক্ষণের জন্য: আমরা অ্যাপ্লিকেশনটি ডেটাবেসগুলিতে তথ্য সঞ্চয় করতে চাই, তবে পরে এটি কোনও ফাইল সংরক্ষণ করতে বা ওয়েবক্যাল করতে সক্ষম হতে পারে

  • আউটপুটটিং: আমাদের এক্সটিকে একটি সরল স্ট্রিং হিসাবে আউটপুট করতে হবে তবে পরে কোনও সিএসভি, এক্সএমএল, জেএসএন ইত্যাদি হতে পারে output


উদাহরণ

আমার একটি প্রকল্প রয়েছে যেখানে ব্যবহারকারীরা ডেটাবেজে লোকদের পণ্য সরবরাহ করতে পারেন। কোনও ব্যক্তির কাছে পণ্যটির এই নিয়োগের একটি স্ট্যাটাস থাকে যা হয় "অনুমোদিত" বা "অস্বীকৃত", যা কিছু ব্যবসায়িক নিয়মের উপর নির্ভরশীল। উদাহরণস্বরূপ: যদি কোনও ব্যবহারকারী নির্দিষ্ট বয়সের ব্যক্তিকে কোনও পণ্য বরাদ্দ করে তবে তার স্থিতিটি অস্বীকার করা উচিত; আইটেমের দুটি ক্ষেত্রের পার্থক্য যদি 50 এর চেয়ে বেশি হয় তবে এটির স্থিতি হ্রাস করা হবে ইত্যাদি

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

public interface IRule {
    bool IsApproved(Assignment assignment); 
 }

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

এখন যখন উদাহরণস্বরূপ ব্যবস্থাপক হঠাৎ করে এসে বললেন, আমাদের ইন্টার্নগুলিতে সমস্ত কার্যাদি বা অতিরিক্ত সময় কাজ করা লোকদের সমস্ত অ্যাসাইনমেন্টও প্রত্যাখ্যান করা উচিত ... আপনি নতুন ক্লাস করুন:

public OvertimeRule : IRule
{
    public bool IsApproved(Assignment assignment) //Interface method
    {
        if (assignment.Person.Timesheet >= 40)
        {
            return false;
        }
        return true;
    }
}

public InternRule : IRule
{
    public bool IsApproved(Assignment assignment) //Interface method
    {
        if (assignment.Person.Title == "Intern")
        {
            return false;
        }
        return true;
    }
}

আপনি দেখতে পাচ্ছেন যে আপনাকে যদি বিবৃতি বা কোড যুক্ত বা মুছে ফেলতে হবে না, কেবল একটি নতুন নিয়ম-শ্রেণি তৈরি করুন যা IRUle ইন্টারফেসটি প্রয়োগ করে এবং প্রয়োজনে সেগুলি স্যুইচ করে।


আরেকটি দুর্দান্ত উদাহরণ: http://www.asp.net/mvc/pluralsight এ স্কট অ্যালেনের ভিডিও সিরিজ যেখানে তিনি আবেদনের ইউনিট-পরীক্ষার অংশে কৌশল প্যাটার্নটি ব্যবহার করেন

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


আমি জানি এটি প্রশ্নের আওতার বাইরে কিছুটা হলেও এরপরে কী আসে? আমাদের InternRuleএখন এটি আছে তবে আমরা কীভাবে ট্রিগার করছি OvertimeRule? আমরা কীভাবে তা নিশ্চিত করতে পারি যে যুক্তি OvertimeRule.IsApprovedএখনই ডেকেছে InternRule.IsApproved?
স্পেনসার রুপোর্ট

15

মূল নোট:

  1. কৌশল হ'ল আচরণগত ডিজাইনের ধরণ। এটি অ্যালগরিদমের পরিবারের মধ্যে পরিবর্তন করতে ব্যবহৃত হয় used

  2. এই প্যাটার্নটিতে একটি বিমূর্ত কৌশল ইন্টারফেস এবং সেই ইন্টারফেসের অনেকগুলি কংক্রিট কৌশল বাস্তবায়ন ( অ্যালগরিদম ) রয়েছে।

  3. অ্যাপ্লিকেশনটি কেবল কৌশল ইন্টারফেস ব্যবহার করে । কিছু কনফিগারেশন প্যারামিটারের উপর নির্ভর করে কংক্রিট কৌশলটি ইন্টারফেসে ট্যাগ করা হবে ।

উইকিপিডিয়া থেকে ইউএমএল ডায়াগ্রাম

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

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

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

import java.util.*;

/* Interface for Strategy */
interface OfferStrategy {
    public String getName();
    public double getDiscountPercentage();
}
/* Concrete implementation of base Strategy */
class NoDiscountStrategy implements OfferStrategy{
    public String getName(){
        return this.getClass().getName();
    }
    public double getDiscountPercentage(){
        return 0;
    }
}
/* Concrete implementation of base Strategy */
class QuarterDiscountStrategy implements OfferStrategy{
    public String getName(){
        return this.getClass().getName();
    }
    public double getDiscountPercentage(){
        return 0.25;
    }
}
/* Context is optional. But if it is present, it acts as single point of contact
   for client. 

   Multiple uses of Context
   1. It can populate data to execute an operation of strategy
   2. It can take independent decision on Strategy creation. 
   3. In absence of Context, client should be aware of concrete strategies. Context acts a wrapper and hides internals
   4. Code re-factoring will become easy
*/
class StrategyContext {
    double price; // price for some item or air ticket etc.
    Map<String,OfferStrategy> strategyContext = new HashMap<String,OfferStrategy>();
    StrategyContext(double price){
        this.price= price;
        strategyContext.put(NoDiscountStrategy.class.getName(),new NoDiscountStrategy());
        strategyContext.put(QuarterDiscountStrategy.class.getName(),new QuarterDiscountStrategy());        
    }
    public void applyStrategy(OfferStrategy strategy){
        /* 
        Currently applyStrategy has simple implementation. You can use Context for populating some more information,
        which is required to call a particular operation            
        */
        System.out.println("Price before offer :"+price);
        double finalPrice = price - (price*strategy.getDiscountPercentage());
        System.out.println("Price after offer:"+finalPrice);
    }
    public OfferStrategy getStrategy(int monthNo){
        /*
            In absence of this Context method, client has to import relevant concrete Strategies everywhere.
            Context acts as single point of contact for the Client to get relevant Strategy
        */
        if ( monthNo < 6 )  {
            return strategyContext.get(NoDiscountStrategy.class.getName());
        }else{
            return strategyContext.get(QuarterDiscountStrategy.class.getName());
        }

    }
}
public class StrategyDemo{    
    public static void main(String args[]){
        StrategyContext context = new StrategyContext(100);
        System.out.println("Enter month number between 1 and 12");
        int month = Integer.parseInt(args[0]);
        System.out.println("Month ="+month);
        OfferStrategy strategy = context.getStrategy(month);
        context.applyStrategy(strategy);
    }

}

আউটপুট:

Enter month number between 1 and 12
Month =1
Price before offer :100.0
Price after offer:100.0

Enter month number between 1 and 12
Month =7
Price before offer :100.0
Price after offer:75.0

দরকারী নিবন্ধ:

dzone দ্বারা কৌশল প্যাটার্ন

উত্স তৈরির মাধ্যমে কৌশল প্যাটার্ন


ধন্যবাদ .... পেরেফ্যাক্ট ইন্দ্রিয় তোলে .... সম্মতি প্রয়োগ স্ট্র্যাটেজি () প্রচুর কালো যাদু অর্জন করার জন্য একটি দৈত্য। কৌশল হিসাবে কৌশল অবলম্বনের অ স্থিতিশীল
পদ্ধতিটি

12

আমি বেশ কয়েকটি মোটামুটি সহজ উদাহরণ সম্পর্কে ভাবতে পারি:

  • একটি তালিকা বাছাই করা হচ্ছে। কৌশলটি হ'ল তালিকার দুটি আইটেমের মধ্যে কোনটি "প্রথম" তা স্থির করার জন্য ব্যবহৃত তুলনা
  • আপনার কাছে এমন একটি অ্যাপ্লিকেশন থাকতে পারে যেখানে রানটাইমের সময় বাছাই করা অ্যালগরিদম নিজেই (কুইকসোর্ট, হিপসোর্ট ইত্যাদি) বেছে নেওয়া যেতে পারে
  • লগ 4 নেট এবং লগ 4 জে অ্যাপেন্ডার, লেআউট এবং ফিল্টার
  • ইউআই টুলকিটগুলিতে লেআউট ম্যানেজার
  • তথ্য সংকোচন. আপনার আইসি কমপ্রেসার ইন্টারফেস থাকতে পারে যার একমাত্র পদ্ধতিটি দেখতে এমন কিছু দেখাচ্ছে:

    বাইট [] কমপ্রেস (বাইট [] ইনপুট);

    আপনার কংক্রিটের সংকোচনের ক্লাসগুলি রানলেন্থথ কমপ্রেশন, ডিফলেটকম্প্রেশন ইত্যাদির মতো জিনিস হতে পারে


9

কৌশল প্যাটার্নের একটি সাধারণ ব্যবহার হ'ল কাস্টম বাছাইয়ের কৌশলগুলি (উচ্চতর অর্ডার ফাংশনবিহীন ভাষাগুলিতে) সংজ্ঞায়িত করা, উদাহরণস্বরূপ জাভাতে দৈর্ঘ্য অনুসারে স্ট্রিংগুলির তালিকা বাছাই করা, বেনামে একটি অভ্যন্তরীণ শ্রেণি (কৌশল ইন্টারফেসের প্রয়োগ) পাস করা:

List<String> names = Arrays.asList("Anne", "Joe", "Harry");
Collections.sort(names, new Comparator<String>() {
  public int compare(String o1, String o2) {
    return o1.length() - o2.length();
  }
});
Assert.assertEquals(Arrays.asList("Joe", "Anne", "Harry"), names);

একইভাবে, কৌশলগুলি বস্তুর ডেটাবেসগুলির সাথে দেশীয় প্রশ্নের জন্য ব্যবহার করা যেতে পারে, যেমন db4o তে:

List<Document> set = db.query(new Predicate<Document>() {
  public boolean match(Document candidate) {
    return candidate.getSource().contains(source);
  }
});

8

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

এই সিঙ্ক্রোনাইজেশনটি করতে আমি একটি কম্পোজেবল কৌশল প্যাটার্ন ব্যবহার করি। মূল প্রোগ্রামটি মূলত সপ্তাহের দিন (কেবলমাত্র সিঙ্ক পরিবর্তন / সমস্ত সিঙ্ক করে) এবং একাডেমিক ক্যালেন্ডারের সাথে সম্পর্কিত সেমিস্টারের সময় নির্ভর করে একটি মাস্টার কৌশল বেছে নেয় strategy যদি বিলিং চক্রটি শেষ হয়, তবে এটি বিলিংয়ের কৌশল দ্বারা এটিও রচনা করে। এটি তখন একটি মানক ইন্টারফেসের মাধ্যমে নির্বাচিত কৌশল চালায় runs

আমি জানি না এটি কতটা সাধারণ, তবে আমার মনে হয়েছে এটি কৌশল প্যাটার্নের জন্য উপযুক্ত fit


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

7

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি মনে করি আমার আরও একটি আকর্ষণীয় উদাহরণ রয়েছে যা আমি সম্প্রতি প্রয়োগ করেছি।

ডকুমেন্ট ডেলিভারি সিস্টেমে কৌশল প্যাটার্নটি ব্যবহার করার এটি একটি খুব ব্যবহারিক উদাহরণ।

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

বিভিন্ন গ্রাহকরা এই সিস্টেমটি ব্যবহার করেছেন, এবং ত্রুটির ক্ষেত্রে তাদের বিভিন্ন রোলব্যাক / ত্রুটি পরিচালনার প্রয়োজনীয়তা ছিল: একজন প্রথম ত্রুটিতে ডেলিভারি সিস্টেমটি থামাতে চেয়েছিল, ইতিমধ্যে সমস্ত স্টোরগুলিতে জমা দেওয়া সমস্ত নথি তাদের রেখে দেয়, তবে প্রক্রিয়াটি থামিয়ে দেয় এবং অন্য কিছু সরবরাহ না করে ; অন্য কেউ চান যে এটি Bসংরক্ষণ করার সময় ত্রুটির ক্ষেত্রে এটি থেকে রোলব্যাক করতে পারে Cতবে ইতিমধ্যে যা সরবরাহ করা হয়েছিল তা ছেড়ে দিন A। এটি সহজেই অনুমেয় যে তৃতীয় বা চতুর্থ ব্যক্তিরও বিভিন্ন প্রয়োজন হবে।

সমস্যা সমাধানের জন্য, আমি একটি মৌলিক বিতরণ শ্রেণি তৈরি করেছি যাতে ডেলিভারি যুক্তি রয়েছে, এবং সমস্ত স্টোর থেকে স্টাফ ফিরে ঘুরিয়ে দেওয়ার জন্য পদ্ধতিগুলি। এই পদ্ধতিগুলি আসলে ত্রুটির ক্ষেত্রে ডেলিভারি সিস্টেম দ্বারা ডাকা হয় না। পরিবর্তে, ক্লাসটি "রোলব্যাক / ত্রুটি হ্যান্ডলিং কৌশল" শ্রেণি (সিস্টেমটি ব্যবহার করে গ্রাহকের উপর ভিত্তি করে) পাওয়ার জন্য ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করে, যা ত্রুটির ক্ষেত্রে বলা হয়, যা কৌশলটির জন্য উপযুক্ত হলে রোলব্যাক পদ্ধতিগুলিকে কল করে calls

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

rollbackStrategy.reportSuccessA(...);
rollbackStrategy.reportFailureB(...);

if (rollbackStrategy.mustAbort()) {
    rollbackStrategy.rollback(); // rollback whatever is needed based on reports
    return false;
}

সুতরাং আমার কাছে এখন দুটি ভিন্ন কৌশল রয়েছে: একটি হ'ল QuitterStrategy(যা প্রথম ত্রুটি থেকে বেরিয়ে আসে এবং কিছুই পরিষ্কার করে না) এবং অন্যটি হ'ল MaximizeDeliveryToAStrategy(যা প্রক্রিয়াটি বাতিল না করার জন্য যথাসাধ্য চেষ্টা করে এবং স্টোরেজে বিতরণ করা জিনিসটি কখনই না A, তবে রোলব্যাকস স্টাফ Bযদি বিতরণে Cব্যর্থ হয়))

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

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

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

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


6

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


4
আমি ভেবেছিলাম যে গৃহীত উত্তরটি এই উদাহরণটি সম্পর্কে কথা বলার কথা ছিল :)
জ্যানকার্লো ফন্টালভো

6

কৌশল প্যাটার্নটি সাধারণত বৈধতা এবং বাছাইকরণ অ্যালগরিদমের জন্য বিশেষত ব্যবহৃত প্যাটার্ন হয়।

আমাকে একটি সাধারণ ব্যবহারিক উদাহরণ দিয়ে ব্যাখ্যা করতে দিন

enum Speed {
  SLOW, MEDIUM, FAST;
}

class Sorter {
 public void sort(int[] input, Speed speed) {
    SortStrategy strategy = null;
    switch (speed) {
    case SLOW:
        strategy = new SlowBubbleSortStrategy();
        break;
    case MEDIUM:
        strategy = new MediumInsertationSortStrategy();
        break;

    case FAST:
        strategy = new FastQuickSortStrategy();
        break;
    default:
        strategy = new MediumInsertationSortStrategy();
    }
    strategy.sort(input);
 }

}

interface SortStrategy {

    public void sort(int[] input);
}

class SlowBubbleSortStrategy implements SortStrategy {

   public void sort(int[] input) {
    for (int i = 0; i < input.length; i++) {
        for (int j = i + 1; j < input.length; j++) {
            if (input[i] > input[j]) {
                int tmp = input[i];
                input[i] = input[j];
                input[j] = tmp;
            }
        }
    }
    System.out.println("Slow sorting is done and the result is :");
    for (int i : input) {
        System.out.print(i + ",");
    }
  }

 }

class MediumInsertationSortStrategy implements SortStrategy {

public void sort(int[] input) {
    for (int i = 0; i < input.length - 1; i++) {
        int k = i + 1;
        int nxtVal = input[k];
        while (input[k - 1] > nxtVal) {
            input[k] = input[k - 1];
            k--;
            if (k == 0)
                break;
        }
        input[k] = nxtVal;
    }
    System.out.println("Medium sorting is done and the result is :");
    for (int i : input) {
        System.out.print(i + ",");
    }

 }

}

class FastQuickSortStrategy implements SortStrategy {

public void sort(int[] input) {
    sort(input, 0, input.length-1);
    System.out.println("Fast sorting is done and the result is :");
    for (int i : input) {
        System.out.print(i + ",");
    }
}

private void sort(int[] input, int startIndx, int endIndx) {
    int endIndexOrig = endIndx;
    int startIndexOrig = startIndx;
    if( startIndx >= endIndx)
        return;
    int pavitVal = input[endIndx];
    while (startIndx <= endIndx) {
        while (input[startIndx] < pavitVal)
            startIndx++;
        while (input[endIndx] > pavitVal)
            endIndx--;
        if( startIndx <= endIndx){
            int tmp = input[startIndx];
            input[startIndx] = input[endIndx];
            input[endIndx] = tmp;
            startIndx++;
            endIndx--;
        }
    }
    sort(input, startIndexOrig, endIndx);
    sort(input, startIndx, endIndexOrig);
 }

}  

এর জন্য পরীক্ষার কোডটি

public class StrategyPattern {
  public static void main(String[] args) {
    Sorter sorter = new Sorter();
    int[] input = new int[] {7,1,23,22,22,11,0,21,1,2,334,45,6,11,2};
    System.out.print("Input is : ");
    for (int i : input) {
        System.out.print(i + ",");
    }
    System.out.println();
    sorter.sort(input, Speed.SLOW);
 }

}

একই উদাহরণ http://coder2design.com/strategy-pattern/ থেকে নেওয়া হয়েছে


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

2

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

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

আমরা তখন বুঝতে পেরেছিলাম যে আমাদের একাধিক অ্যালগরিদম ছিল কিছু কিছু প্যারামিটারের ওজনের উপর ভিত্তি করে ছিল, অন্যরা খুব অদ্ভুত এবং প্রোপাইটারি ছিল এবং আমি ভিজিও এবং চার্টগুলি না টানিয়ে তাদের বিচার করতে পারিনি এবং ভালভাবে আপনি ছবিটি পেয়েছেন, আমাদের প্রচুর অ্যালগরিদম ছিল সেরা মানুষ নির্বাচন করা।

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

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


2

আপনি কি নিশ্চিত যে "আদেশ" এর স্থিতি কোনও রাজ্য নিদর্শন নয়? আমার একটি হান্চ আছে যে কোনও অর্ডার এর স্থিতির উপর নির্ভর করে আলাদাভাবে পরিচালনা করা হবে না।

উদাহরণস্বরূপ অর্ডার পদ্ধতিতে শিপ করুন:

order.Ship();
  • যদি শিপিংয়ের পদ্ধতিটি এর স্থিতি অনুসারে পরিবর্তিত হয়, তবে আপনি একটি কৌশল বিন্যাস পেয়েছেন।
  • তবে যদি অর্ডার প্রদান করা হয় কেবলমাত্র শিপ () পদ্ধতিটি সফল হয় এবং অর্ডারটি এখনও প্রেরণ করা হয়নি, আপনি একটি রাষ্ট্রীয় প্যাটার্ন পেয়েছেন।

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


2

ধরা যাক আপনি প্রদত্ত মাস এবং বছরের নবম Xday গণনা করার জন্য একটি অ্যালগরিদম লিখতে চান , উদাহরণস্বরূপ, অক্টোবর 2014 এর দ্বিতীয় সোমবার android.text.format.Time। তারিখটি উপস্থাপন করার জন্য আপনি অ্যান্ড্রয়েডের টাইম ক্লাসটি ব্যবহার করতে চান তবে আপনি একটি জেনেরিক অ্যালগরিদমও লিখতে চান এটি প্রয়োগও করতে পারে java.util.Calendar

এটাই আমি করেছি।

ডেটটাইমথ.জভাতে:

public interface DatetimeMath { 
    public Object createDatetime(int year, int month, int day);

    public int getDayOfWeek(Object datetime);

    public void increment(Object datetime);
}

টাইমমথ.জভাতে:

public class TimeMath implements DatetimeMath {
    @Override
    public Object createDatetime(int year, int month, int day) {
        Time t = new Time();
        t.set(day, month, year);
        t.normalize(false);
        return t;
    }

    @Override
    public int getDayOfWeek(Object o) {
        Time t = (Time)o;
        return t.weekDay;
    }   

    @Override
    public void increment(Object o) {
        Time t = (Time)o;
        t.set(t.monthDay + 1, t.month, t.year);
        t.normalize(false);
    }
}

অর্ডিনালডয়েঅফ উইকক্যালকুলেটর.জভাতে জেনেরিক অ্যালগরিদম সহ শ্রেণি:

public class OrdinalDayOfWeekCalculator {   
    private DatetimeMath datetimeMath;

    public OrdinalDayOfWeekCalculator(DatetimeMath m) {
        datetimeMath = m;
    }

    public Object getDate(int year, int month, int dayOfWeek, int ordinal) {
        Object datetime = datetimeMath.createDatetime(year, month, 1);
        if (datetimeMath.getDayOfWeek(datetime) == dayOfWeek) {
            return datetime;
        } 
        int xDayCount = 0;
        while (xDayCount != ordinal) {
            datetimeMath.increment(datetime);
            if (datetimeMath.getDayOfWeek(datetime) == dayOfWeek) {
                xDayCount++;
            }
        }
        return datetime;
    }
}

আমার অ্যান্ড্রয়েড অ্যাপে আমি এমন কিছু কল করব

OrdinalDayOfWeekCalculator odowc = 
        new OrdinalDayOfWeekCalculator(new TimeMath());
Time canadianThanksgiving = (Time)odowc.getDate(
        year, Calendar.OCTOBER, Time.MONDAY, 2);

যদি আমি একই অ্যালগরিদমটির জন্য আবার ব্যবহার করতে চাই java.util.Calendar, আমি কেবল একটি ক্লাস ক্যালেন্ডার ম্যাথ লিখব যা ডেটটাইমথের তিনটি পদ্ধতি প্রয়োগ করে এবং তারপরে ব্যবহার করবে

OrdinalDayOfWeekCalculator odowc2 = 
        new OrdinalDayOfWeekCalculator(new CalendarMath());
Calendar canadianThanksgivingCal = (Calendar)odowc2.getDate(
        year, Calendar.OCTOBER, Calendar.MONDAY, 2);

2
public class StrategyDemo {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();

        Item item1 = new Item("1234", 10);
        Item item2 = new Item("5678", 40);

        cart.addItem(item1);
        cart.addItem(item2);

        // pay by paypal
        cart.pay(new PaypalStrategy("myemail@example.com", "mypwd"));

        // pay by credit card
        cart.pay(new CreditCardStrategy("Pankaj Kumar", "1234567890123456", "786", "12/15"));
    }
}

interface PaymentStrategy {
    public void pay(int amount);
}

class CreditCardStrategy implements PaymentStrategy {

    private String name;
    private String cardNumber;
    private String cvv;
    private String dateOfExpiry;

    public CreditCardStrategy(String nm, String ccNum, String cvv, String expiryDate) {
        this.name = nm;
        this.cardNumber = ccNum;
        this.cvv = cvv;
        this.dateOfExpiry = expiryDate;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount + " paid with credit/debit card");
    }

}

class PaypalStrategy implements PaymentStrategy {

    private String emailId;
    private String password;

    public PaypalStrategy(String email, String pwd) {
        this.emailId = email;
        this.password = pwd;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount + " paid using Paypal.");
    }

}

class Item {

    private String upcCode;
    private int price;

    public Item(String upc, int cost) {
        this.upcCode = upc;
        this.price = cost;
    }

    public String getUpcCode() {
        return upcCode;
    }

    public int getPrice() {
        return price;
    }

}

class ShoppingCart {

    // List of items
    List<Item> items;

    public ShoppingCart() {
        this.items = new ArrayList<Item>();
    }

    public void addItem(Item item) {
        this.items.add(item);
    }

    public void removeItem(Item item) {
        this.items.remove(item);
    }

    public int calculateTotal() {
        int sum = 0;
        for (Item item : items) {
            sum += item.getPrice();
        }
        return sum;
    }

    public void pay(PaymentStrategy paymentMethod) {
        int amount = calculateTotal();
        paymentMethod.pay(amount);
    }
}

1

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

public interface CollectibleElephant { 
    long getId();
    String getName();
    long getTagId();
}

public class Elephant implements CollectibleElephant { ... }
public class BabyElephant implements CollectibleElephant { ... }

মূলত, আমি এস CollectibleElephantবাছাই করতে ব্যবহার করতে চেয়েছিলাম Elephant। খুব তাড়াতাড়ি, আমার সতীর্থরা CollectibleElephantসুরক্ষা চেক পরিচালনা করতে, জিইউআইতে প্রেরণ হওয়ার সাথে সাথে এগুলি ফিল্টার করে, ইত্যাদি ফিল্টার করে om


1

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

সেই ডেটা লেখার প্রক্রিয়াটি তখন বেশ সহজ ছিল, অগ্রাধিকারের সারির শীর্ষটি পপ করে রাখুন এবং তারপরে আপনি যে অবজেক্টটি বের করেন তার ধরণের ভিত্তিতে একটি কৌশল বেছে নিন।


0

উইকিপিডিয়া থেকে

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

উইন্ডোজ পেইন্ট অ্যাপ্লিকেশনটিতে আপনি একটি কৌশল প্যাটার্ন দেখতে পারেন যেখানে আপনি আলাদা আলাদা বিভাগে স্বতন্ত্র আকার এবং রঙ চয়ন করতে পারেন। এখানে আকৃতি এবং রঙ হ'ল আলগোরিদিম যা রানটাইমের সময় পরিবর্তিত হতে পারে।

আপনি যদি 'রেড সার্কেল' এর বিকল্প সরবরাহ না করে লাল রঙের সাথে একটি বৃত্ত আঁকতে চান তবে তারা আপনাকে আপনার পছন্দসই বৃত্ত এবং একটি রঙ চয়ন করতে দেয়।

Shape redCircle = new RedCircle(); // Without stretegy Pattern
Shaped redCircle = new Shape("red","circle"); // With Strategy pattern

কৌশল বিন্যাস ছাড়াই আকার এবং রঙের কার্টেসিয়ান পণ্য সহ শ্রেণীর সংখ্যা বাড়িয়ে তুলবে। এছাড়াও প্রতিটি বাস্তবায়নের জন্য ইন্টারফেস পরিবর্তিত হয়।


0

উদাহরণস্বরূপ এআই শত্রুদের সাথে শ্যুটারের খেলাটি কল্পনা করুন। আপনি যা চান তার উপর ভিত্তি করে তারা ক্রমাগতভাবে বিভিন্নভাবে লড়াই করতে চান .. কৌশল প্যাটার্নের সাহায্যে আপনি ক্রমাগত লুপ করতে পারেন এবং কোনও নির্দিষ্ট বা ক্রিয়া কীভাবে সম্পাদন করা হবে তা পরিবর্তনশীলভাবে পরিবর্তন করতে পারেন।

interface FightingStategy{
    public void fight();
}
public Defense implements FightingStrategy{
    public void figth(){
        ... hide behind wall to shoot
    }
}
public Berserker implements FightingStrategy{
    public void fight(){
        ... run towards you, headrolls and shoots
    }
}
public Dead implements FightingStrategy{
    public void fight(){
        ... is dead, doesn't move
    }
}

public AiShooter{

    FightingStrategy fightingStrategy;

    public AiShooter(){
        fightStrategy = new Berserker();
    }

    public void fight(){
        this.fightingStrategy.fight();
    }

    public void changeStrategy(FightingStrategy f){
        this.fightingStrategy = f;
    }
}

public static void main(){

    ... create list of AiShooters...
    while (condition){
        list.forEach(shooter -> shooter.fight());
    }
    ... you shoot back
    list.ForEach(shooter -> shooter.changeStrategy(new 
Defense()));

    ... you kill one
    list.get(n).changeStrategy(new Dead());
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.