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


136

প্রক্সি এবং ডেকরেটারের মধ্যে পার্থক্য কী আপনি কোনও ভাল ব্যাখ্যা দিতে পারেন ?

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

প্রশ্ন হল - না প্রক্সি তৈরি হয়, তার অ্যাগ্রিগেশন এখনও প্রক্সি অথবা বরং প্রসাধক ? এটি কি (GoF প্যাটার্ন সংজ্ঞা অনুসারে) একত্রিত করে প্রক্সি তৈরি করার অনুমতি দেওয়া হয়েছে ?


2
কিছু লিঙ্ক: প্রক্সি এবং প্রসাধক
Sotirios Delimanolis

5
আপনি কোথায় এমন ধারণা পেয়েছিলেন যে প্রক্সি রচনা ব্যবহার করে এবং ডেকরেটার একত্রিত করে?
সিপারকিনস

1
রাহুল ত্রিপাঠীর উত্তরের জন্য আমার মন্তব্য @ সিগার্কিনস দেখুন
asukasz Rzeszotarski

1
এবং অলঙ্করণকারী ( প্যাটার্নস.সি.ইপ.এক.জেজা / উদাহরণস্বর / চ 2 / ডেকোরেটর- থিওরি.সি ) - স্পষ্টতই সমষ্টি, প্রক্সি ( প্যাটার্নস.সি.আপ.এ্যাক.জা / এক্সামস / সিচ 2/proxy- theory.cs ) - স্পষ্টতই রচনা।
হায়ানকভ

উত্তর:


17

এখানে জিওএফ থেকে সরাসরি উদ্ধৃতি দেওয়া হয়েছে (পৃষ্ঠা 216)।

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

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

জনপ্রিয় উত্তরগুলি ইঙ্গিত দেয় যে কোনও প্রক্সি তার প্রতিনিধিদের কংক্রিটের ধরণ জানেন। এই উদ্ধৃতি থেকে আমরা দেখতে পারি যে এটি সর্বদা সত্য নয়।

GoF অনুসারে প্রক্সি এবং ডিকোয়টারের মধ্যে পার্থক্য হ'ল প্রক্সি ক্লায়েন্টকে সীমাবদ্ধ করে। সাজসজ্জা করে না। প্রক্সি কার্যকারিতা অ্যাক্সেস নিয়ন্ত্রণ করে একটি ক্লায়েন্ট যা করতে পারে তা সীমাবদ্ধ করতে পারে; অথবা এটি কোনও ক্লায়েন্ট যা জানে তা সীমাবদ্ধ করতে পারে অদৃশ্য এবং অজানা এমন ক্রিয়া সম্পাদন করে । সাজসজ্জা বিপরীতটি করে: এটি তার প্রতিনিধিগুলি এমনভাবে কী করে যা ক্লায়েন্টদের কাছে দৃশ্যমান।

আমরা বলতে পারি যে প্রক্সি একটি কালো বাক্স এবং ডেকোরেটর একটি সাদা বাক্স।

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

  • সাজসজ্জাকারী তার ক্লায়েন্টকে অবহিত এবং ক্ষমতা দেয়।
  • প্রক্সি তার ক্লায়েন্টকে সীমাবদ্ধ করে এবং বিতরণ করে।

113

আসল পার্থক্য হ'ল মালিকানা (রচনা বনাম সমষ্টি) নয়, বরং টাইপ-ইনফরমেশন।

একটি প্রসাধক হয় সবসময় তার delegatee গৃহীত। একটি প্রক্সি এটি নিজে তৈরি করতে পারে , বা সে হতে পারে এটা ইনজেকশনের আছে।

তবে একটি প্রক্সি সর্বদা প্রতিনিধিদের (আরও) নির্দিষ্ট ধরণের জানেন। অন্য কথায়, প্রক্সি এবং তার প্রতিনিধিদের একই বেস টাইপ থাকবে তবে প্রক্সিটি কিছু উত্পন্ন প্রকারকে নির্দেশ করে। একটি সাজসজ্জা তার নিজস্ব বেস প্রকারের দিকে নির্দেশ করে। সুতরাং, পার্থক্যটি প্রতিনিধিটির ধরণ সম্পর্কে সংকলন-সময় তথ্যের মধ্যে রয়েছে।

গতিশীল ভাষায়, যদি প্রতিনিধিটিকে ইনজেকশন দেওয়া হয় এবং একই ইন্টারফেসটি ঘটে থাকে তবে কোনও পার্থক্য নেই।

আপনার প্রশ্নের উত্তর "হ্যাঁ"।


2
"তবে একটি প্রক্সি সর্বদা প্রতিনিধিদের (আরও) নির্দিষ্ট ধরণের জানেন" "আমি এটি সত্য বলে মনে করি না। দূরবর্তী প্রক্সি কল্পনা করুন। প্রক্সি করার পদ্ধতিটি দূরবর্তী অবজেক্টের কোনও সুনির্দিষ্ট জানতে হবে না। রিমোট সিস্টেম নির্দিষ্ট ইন্টারফেসের সাহায্যে নিবন্ধটি নিবন্ধ করে। এবং স্থানীয় প্রক্সি একই ইন্টারফেসটি প্রকাশ করে।
আলেক্সি

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

85

ডেকোরেটর প্যাটার্ন কোনও বস্তুতে গতিশীল ফাংশন যুক্ত করার উপর দৃষ্টি নিবদ্ধ করে, অন্যদিকে প্রক্সি প্যাটার্ন কোনও বস্তুর অ্যাক্সেস নিয়ন্ত্রণে মনোনিবেশ করে।

সম্পাদনা করুন: -

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


5
একটি প্রক্সি এখনও কার্যকারিতা যুক্ত করতে ব্যবহার করা যেতে পারে। এওপি প্রক্সির কথা ভাবুন।
সোটিরিওস ডেলিমনোলিস

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

এই ক্ষেত্রে যখন প্রক্সিটিতে উদাহরণটি 'লুকানো' থাকে তখন দ্বিফায়িকতা আমার পক্ষে স্পষ্ট হয় (যেমনটি আমি লিখেছি) তবে আমি মনে করি যে প্রায়শই লোকেরা প্রক্সি ক্লাস নামে ডাকে যা প্রক্সাইড অবজেক্টকে কনস্ট্রাক্টর প্যারামিটার হিসাবে পাস করেছিল take এই ক্ষেত্রে নতুন কার্যকারিতা যুক্ত করার বা নিয়ন্ত্রণ করার পার্থক্যটি আমার পক্ষে (খুব) পাতলা।
asukasz Rzeszotarski

5
প্রক্সি এবং প্রকৃত বিষয়ের মধ্যে সম্পর্ক সাধারণত সংকলনের সময় সেট করা হয়, প্রক্সি এটি কোনও উপায়ে ইনস্ট্যান্ট করে তোলে, যেখানে ডেকোরিটার বা অ্যাডাপ্টারের কেবলমাত্র বিষয়বস্তুটির ইন্টারফেস জেনে রানটাইমের সময় বিষয়টিকে বরাদ্দ করা হয়। আশা করি তা বোধ হয় !!! :)
রাহুল ত্রিপাঠি

1
এটি আপনার উত্তরটিতে এই লাইনটি যুক্ত করতে পারে।
asukasz Rzeszotarski

49

প্রসাধক সজ্জিত বস্তুর জন্য পেতে রেফারেন্স (সাধারণত কন্সট্রাকটর মাধ্যমে) যখন প্রক্সি করতে দায়ী যে নিজে।

প্রক্সি এ সব instantiate মোড়ানো বস্তু যখন (এই মত যদি বস্তুর ক্ষেত্র / getters ব্যবহার করা হয় না ডিবি অপ্রয়োজনীয় প্রবেশ রোধ করার ORMs না) নাও হতে পারে প্রসাধক সর্বদা প্রকৃত আবৃত উদাহরণস্বরূপ লিংক ধরে রাখুন।

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

ডেকোরেটর সাধারণত বিকাশকারী দ্বারা পুরানো বা উত্তরাধিকার শ্রেণিতে নতুন আচরণ যুক্ত করত ইন্টারফেসের পরিবর্তে প্রকৃত শ্রেণীর উপর ভিত্তি করে (তাই এটি ইন্টারফেসের বিভিন্ন দৃষ্টান্তে কাজ করে, প্রক্সিটি কংক্রিট শ্রেণীর চারপাশে থাকে)।


22

মূল পার্থক্য:

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

উত্স তৈরির নিবন্ধটি চমৎকার উপায়ে মিল এবং পার্থক্য উদ্ধৃত করে।

সম্পর্কিত এসই প্রশ্ন / লিঙ্ক:

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

অ্যাডাপ্টার এবং প্রক্সি নিদর্শন মধ্যে সঠিক পার্থক্য কি?


3

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

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


আপনি কী বলছেন যা ইতিমধ্যে এখানে অন্য 4 টি উত্তর থেকে আলাদা?
স্টিফেন রাউচ

আমি জানি না এটা সব আছে কিনা। আমি কেবল পূর্ববর্তী উত্তরগুলি পড়ার পরে চিমটি দেওয়ার তাগিদ অনুভব করেছি।
জেমস লিন

1

এই উত্তরটি এবং এর প্রকৃত অর্থটি খুঁজে বের করতে কিছুক্ষণ সময় নিল । কয়েকটি উদাহরণ এটি আরও স্পষ্ট করা উচিত।

Proxy প্রথম:

public interface Authorization {
    String getToken();
} 

এবং :

// goes to the DB and gets a token for example
public class DBAuthorization implements Authorization {
    @Override
    public String getToken() {
        return "DB-Token";
    }
}

এবং এটির একজন আহ্বানকারী Authorization, খুব বোবা:

class Caller {
    void authenticatedUserAction(Authorization authorization) {
        System.out.println("doing some action with : " + authorization.getToken());
    }
}

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

public class LoggingDBAuthorization implements Authorization {

    private final DBAuthorization dbAuthorization = new DBAuthorization();

    @Override
    public String getToken() {
        String token = dbAuthorization.getToken();
        System.out.println("Got token : " + token);
        return token;
    }
}

আমরা কীভাবে এটি ব্যবহার করব?

public static void main(String[] args) {
    LoggingDBAuthorization loggingDBAuthorization = new LoggingDBAuthorization();

    Caller caller = new Caller();
    caller.authenticatedUserAction(loggingDBAuthorization);
}

লক্ষ্য করুন যে একটি উদাহরণ LoggingDBAuthorization ধারণ করেDBAuthorization । উভয় LoggingDBAuthorizationএবং DBAuthorization বাস্তবায়ন Authorization

  • একটি প্রক্সি DBAuthorizationবেস ইন্টারফেস ( Authorization) এর কিছু কংক্রিট বাস্তবায়ন ( ) ধরে রাখবে । অন্য কথায় একটি প্রক্সি জানে যে কী ঠিক করা হচ্ছে।

Decorator:

এটি Proxyইন্টারফেসের সাথে অনেকটা একইরকম শুরু হয় :

public interface JobSeeker {
    int interviewScore();
}

এবং এটি একটি বাস্তবায়ন:

class Newbie implements JobSeeker  {
    @Override
    public int interviewScore() {
        return 10;
    }
}

এবং এখন আমরা আরও অভিজ্ঞ প্রার্থী যুক্ত করতে চাই, এটি তার সাক্ষাত্কার স্কোর যুক্ত করে একে অপরের থেকে একটি যুক্ত করে JobSeeker:

@RequiredArgsConstructor 
public class TwoYearsInTheIndustry implements JobSeeker {

    private final JobSeeker jobSeeker;

    @Override
    public int interviewScore() {
        return jobSeeker.interviewScore() + 20;
    } 
}

লক্ষ্য করুন আমি কীভাবে বললাম যে প্লাসটি অন্য জবসিকারের কাছ থেকে এসেছে , তা নয় Newbie । এ কী সজ্জিত করছে তা ঠিকDecorator জানে না , এটি কেবল সজ্জিত উদাহরণের চুক্তিটি (এটি সম্পর্কে জানে ) জানে । এখানে দ্রষ্টব্য রাখুন যে এটি একটির মতো নয় ; বিপরীতে, এটি সজ্জিত কি ঠিক জানেন।JobSeekerProxy

আপনি প্রশ্ন করতে পারেন যদি এই ক্ষেত্রে দুটি ডিজাইনের ধরণের মধ্যে আসলেই কোনও পার্থক্য আছে? আমরা কি Decoratorহিসাবে লিখতে চেষ্টা করেছি Proxy?

public class TwoYearsInTheIndustry implements JobSeeker {

    private final Newbie newbie = new Newbie();

    @Override
    public int interviewScore() {
        return newbie.interviewScore() + 20;
    }
}

এটি অবশ্যই একটি বিকল্প এবং এই নিদর্শনগুলি কতটা নিকটবর্তী তা হাইলাইট করে; অন্যান্য উত্তরে বর্ণিত হিসাবে সেগুলি এখনও বিভিন্ন পরিস্থিতির জন্য তৈরি।


1

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

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