متى يمكنك استخدام الجسر النمط ؟ كيف هي مختلفة من محول النمط ؟

StackOverflow https://stackoverflow.com/questions/319728

  •  11-07-2019
  •  | 
  •  

سؤال

وقد أي شخص من أي وقت مضى تستخدم جسر نمط في العالم الحقيقي ؟ إذا كان الأمر كذلك ، كيف استخدامه ؟ هل هو أنا أم هو مجرد محول نمط مع القليل من حقن التبعية ألقيت في هذا المزيج ؟ هل حقا تستحق الخاصة النمط ؟

هل كانت مفيدة؟

المحلول

ويستخدم والمثال الكلاسيكي من نمط جسر في تعريف الأشكال في بيئة UI (انظر جسر نمط يكيبيديا دخول ). نمط جسر هو مركب من < وأ href = "http://en.wikipedia.org/wiki/Template_method_pattern" يختلط = "noreferrer"> قالب و <لأ href = "http://en.wikipedia.org/wiki/Strategy_pattern" يختلط = "noreferrer"> أنماط استراتيجية .

ومن وجهة نظر مشتركة بعض جوانب نمط محول في نمط بريدج. ومع ذلك، على حد تعبير من href="http://www.informit.com/articles/article.aspx؟p=30297" هذه المقالة :

<اقتباس فقرة>   

للوهلة الأولى، ونمط جسر يتطلع الكثير مثل نمط محول في أن يتم استخدام الفئة لتحويل نوع واحد من واجهة إلى أخرى. ومع ذلك، فإن القصد من نمط محول هو جعل واجهات واحدة أو أكثر من فئات "بالطريقة نفسها كما ان من فئة معينة. تم تصميم نمط جسر لفصل اجهة فئة من تنفيذه حتى تتمكن من تغيير أو استبدال التنفيذ دون تغيير رمز العميل.

نصائح أخرى

وهناك مجموعة من فيديريكو و<لأ href = "https://stackoverflow.com/a/9406293/ 593415 "> إجابات جون.

عند:

                   ----Shape---
                  /            \
         Rectangle              Circle
        /         \            /      \
BlueRectangle  RedRectangle BlueCircle RedCircle

وريفاكتور إلى:

          ----Shape---                        Color
         /            \                       /   \
Rectangle(Color)   Circle(Color)           Blue   Red

ونمط جسر هو تطبيق المشورة القديمة، "تفضل تكوين على الميراث". يصبح في متناول يدي عندما يجب فئة فرعية أوقات مختلفة بطرق متعامد مع بعضها البعض. نقول يجب تطبيق تسلسل هرمي من الأشكال الملونة. أنت لن فرعية شكل مستطيل مع والدائرة ثم فئة فرعية مستطيل مع RedRectangle، BlueRectangle وGreenRectangle ومثلها للدائرة، هل؟ هل تفضل أن نقول إن كل شكل <م> قد واللون ولتنفيذ تسلسل هرمي من الألوان، وهذا هو نمط بريدج. حسنا، أنا لن تنفذ "التسلسل الهرمي الألوان"، ولكن تحصل على هذه الفكرة ...

عند:

        A
     /     \
    Aa      Ab
   / \     /  \
 Aa1 Aa2  Ab1 Ab2

وريفاكتور إلى:

     A         N
  /     \     / \
Aa(N) Ab(N)  1   2

وترتبط بالتأكيد محول وجسر، والفرق هو خفية. فمن المحتمل أن بعض الناس الذين يعتقدون أنهم يستخدمون واحد من هذه الأنماط هي في الواقع تستخدم نمط آخر.

والتفسير رأيت هو أن يستخدم محول عندما كنت في محاولة لتوحيد واجهات بعض الفئات تتعارض أن <م> موجودة بالفعل . وظائف محول كنوع من الترجمة إلى تطبيقات التي يمكن النظر فيها <م> إرث .

وحين يتم استخدام نمط جسر للالتعليمات البرمجية التي من المرجح أن تكون التأسيسي. كنت تصميم جسر لتوفير واجهة مجردة لتنفيذ ذلك يحتاج إلى تختلف، ولكن يمكنك أيضا تحديد واجهة من تلك الفئات التنفيذ.

وبرامج تشغيل الأجهزة مثال استشهد في كثير من الأحيان من جسر، ولكن يمكنني القول انها جسر إذا كنت تحديد المواصفات واجهة للبائعين الجهاز، لكنه محول إذا كنت تتناولين برامج تشغيل الأجهزة الموجودة، وجعل المجمع الدرجة لتوفير واجهة موحدة.

وهكذا رمز الحكمة، وأنماط متشابهان جدا. الأعمال الحكمة، وانهم مختلفة.

وانظر أيضا http://c2.com/cgi/wiki؟BridgePattern

في تجربتي, جسر هو في كثير من الأحيان نمط متكرر ، لأنه هو الحل كلما هناك نوعان من متعامد الأبعاد في المجال.E. g.الأشكال والرسم الأساليب والسلوكيات ومنصات, صيغ الملفات و serializers وهكذا دواليك.

و نصيحة:أعتقد دائما من أنماط التصميم من منظور مفاهيمي, وليس من تنفيذ المنظور.من وجهة نظر الجسر لا يمكن الخلط مع محول لأنهم حل مشكلة مختلفة ، وتكوين متفوقة على الإرث لا من أجل نفسها ، ولكن لأنه يسمح للتعامل مع متعامد المخاوف بشكل منفصل.

القصد من الجسر و محول مختلفة و نحن بحاجة إلى كل الأنماط بشكل منفصل.

جسر نمط:

  1. بل هو نمط الهيكلية
  2. التجريد تنفيذ ليست ملزمة في وقت الترجمة
  3. التجريد و التنفيذ - على حد سواء يمكن أن تختلف دون التأثير في العميل
  4. يستخدم تكوين على الميراث.

استخدام الجسر نمط عندما:

  1. تريد وقت التشغيل ملزمة التنفيذ ،
  2. لديك انتشار الطبقات الناتجة من جانب واجهة والعديد من التطبيقات ،
  3. كنت ترغب في مشاركة التنفيذ بين كائنات متعددة ،
  4. تحتاج إلى خريطة متعامد الطبقة الهرمية.

@ جون سونميز الإجابة بوضوح فعالية جسر نمط في الحد من فئة التسلسل الهرمي.

يمكنك الرجوع إلى أدناه الوثائق الرابط للحصول على فهم أفضل في جسر نمط مع التعليمات البرمجية المثال

نمط محول:

  1. ذلك يسمح لاثنين لا علاقة لها واجهات للعمل معا من خلال كائنات مختلفة ، وربما لعب نفس الدور.
  2. تحميل الأصلي واجهة.

الاختلافات الرئيسية:

  1. محول يجعل الأشياء تعمل بعد أنها مصممة; الجسر يجعل لهم بالعمل من قبل.
  2. الجسر تم تصميم مقدما السماح التجريد تنفيذ تختلف بشكل مستقل. محول هو وتعديله إلى جعل لا علاقة لها فصول العمل معا.
  3. القصد : محول يسمح لاثنين لا علاقة لها واجهات للعمل معا. الجسر يسمح التجريد تنفيذ تختلف بشكل مستقل.

ذات الصلة SE السؤال مع UML الرسم و عمل كود:

الفرق بين جسر نمط نمط محول

مقالات مفيدة:

sourcemaking الجسر نمط المادة

sourcemaking محول نمط المادة

journaldev الجسر نمط المادة

تحرير:

جسر نمط حقيقي سبيل المثال ( كما في meta.stackoverflow.com اقتراح إدراج وثائق موقع سبيل المثال في هذا المنصب منذ الوثائق هو الذهاب إلى الشمس-مجموعة)

جسر نمط فصل التجريد من التنفيذ بحيث أن كلا يمكن أن تختلف بشكل مستقل.وقد تحقق ذلك مع تكوين بدلا من الميراث.

جسر نمط UML من ويكيبيديا:

Bridge pattern UML from Wikipedia

لديك أربعة عناصر في هذا النمط.

Abstraction:ويعرف واجهة

RefinedAbstraction:وتنفذ التجريد:

Implementor:ويعرف واجهة لتنفيذ

ConcreteImplementor:وتنفذ منفذة واجهة.

The crux of Bridge pattern : اثنين متعامد الطبقة الهرمية باستخدام تكوين (الميراث).التجريد التسلسل الهرمي تنفيذ الهرمي يمكن أن تختلف بشكل مستقل.التنفيذ لم يشير التجريد.التجريد يحتوي على تنفيذ واجهة كعضو (من خلال تكوين).هذا التكوين يقلل من مستوى واحد أكثر من التسلسل الهرمي الميراث.

كلمة حقيقية حالة الاستخدام:

تمكين المركبات المختلفة أن يكون كلا الإصدارين من دليل السيارات والعتاد النظام.

رمز المثال:

/* Implementor interface*/
interface Gear{
    void handleGear();
}

/* Concrete Implementor - 1 */
class ManualGear implements Gear{
    public void handleGear(){
        System.out.println("Manual gear");
    }
}
/* Concrete Implementor - 2 */
class AutoGear implements Gear{
    public void handleGear(){
        System.out.println("Auto gear");
    }
}
/* Abstraction (abstract class) */
abstract class Vehicle {
    Gear gear;
    public Vehicle(Gear gear){
        this.gear = gear;
    }
    abstract void addGear();
}
/* RefinedAbstraction - 1*/
class Car extends Vehicle{
    public Car(Gear gear){
        super(gear);
        // initialize various other Car components to make the car
    }
    public void addGear(){
        System.out.print("Car handles ");
        gear.handleGear();
    }
}
/* RefinedAbstraction - 2 */
class Truck extends Vehicle{
    public Truck(Gear gear){
        super(gear);
        // initialize various other Truck components to make the car
    }
    public void addGear(){
        System.out.print("Truck handles " );
        gear.handleGear();
    }
}
/* Client program */
public class BridgeDemo {    
    public static void main(String args[]){
        Gear gear = new ManualGear();
        Vehicle vehicle = new Car(gear);
        vehicle.addGear();

        gear = new AutoGear();
        vehicle = new Car(gear);
        vehicle.addGear();

        gear = new ManualGear();
        vehicle = new Truck(gear);
        vehicle.addGear();

        gear = new AutoGear();
        vehicle = new Truck(gear);
        vehicle.addGear();
    }
}

الإخراج:

Car handles Manual gear
Car handles Auto gear
Truck handles Manual gear
Truck handles Auto gear

التفسير:

  1. Vehicle هو فكرة مجردة.
  2. Car و Truck هما ملموسة تطبيقات Vehicle.
  3. Vehicle يحدد طريقة مجردة : addGear().
  4. Gear هي منفذة واجهة
  5. ManualGear و AutoGear نوعان من تطبيقات Gear
  6. Vehicle يحتوي على implementor واجهة بدلا من تنفيذ واجهة. Compositon من منفذة واجهة هو جوهر هذا النمط : فإنه يسمح التجريد تنفيذ تختلف بشكل مستقل.
  7. Car و Truck تعريف التنفيذ ( تعريف التجريد) عن التجريد : addGear() :أنه يحتوي على Gear - إما Manual أو Auto

في حالة استخدام(ق) عن جسر نمط:

  1. التجريد و تنفيذ يمكن تغيير مستقلة بعضها البعض وأنها ليست ملزمة في وقت الترجمة
  2. خريطة متعامد الهرمية - واحد التجريد واحد تنفيذ.

ولقد استخدمت نمط جسر في العمل. I البرنامج في C ++، حيث غالبا ما يطلق عليه تعبير PIMPL (مؤشر إلى تطبيق). يبدو مثل هذا:

class A
{
public: 
  void foo()
  {
    pImpl->foo();
  }
private:
  Aimpl *pImpl;
};

class Aimpl
{
public:
  void foo();
  void bar();
};  

في هذا المثال class A يحتوي على واجهة، وclass Aimpl يحتوي على التنفيذ.

واستخدام واحد لهذا النمط هو فضح فقط بعض أعضاء الجمهور من الطبقة التنفيذ، ولكن البعض الآخر لا. في المثال يمكن أن يسمى Aimpl::foo() فقط من خلال واجهة العامة A، ولكن ليس Aimpl::bar()

وهناك ميزة أخرى هي أنه يمكنك تحديد Aimpl في ملف رأس منفصلة أن ليس من الضروري أن يدرج من قبل مستخدمي A. كل ما عليك القيام به هو استخدام الإعلان إلى الأمام من قبل Aimpl يعرف A، ونقل تعريفات جميع وظائف عضو الرجوع pImpl في ملف .cpp. وهذا يمنحك القدرة على الحفاظ على رأس Aimpl الخاص، وتقليل الوقت الترجمة.

لوضع الشكل سبيل المثال في التعليمات البرمجية:

#include<iostream>
#include<string>
#include<cstdlib>

using namespace std;

class IColor
{
public:
    virtual string Color() = 0;
};

class RedColor: public IColor
{
public:
    string Color()
    {
        return "of Red Color";
    }
};

class BlueColor: public IColor
{
public:
    string Color()
    {
        return "of Blue Color";
    }
};


class IShape
{
public:
virtual string Draw() = 0;
};

class Circle: public IShape
{
        IColor* impl;
    public:
        Circle(IColor *obj):impl(obj){}
        string Draw()
        {
            return "Drawn a Circle "+ impl->Color();
        }
};

class Square: public IShape
{
        IColor* impl;
    public:
        Square(IColor *obj):impl(obj){}
        string Draw()
        {
        return "Drawn a Square "+ impl->Color();;
        }
};

int main()
{
IColor* red = new RedColor();
IColor* blue = new BlueColor();

IShape* sq = new Square(red);
IShape* cr = new Circle(blue);

cout<<"\n"<<sq->Draw();
cout<<"\n"<<cr->Draw();

delete red;
delete blue;
return 1;
}

والإخراج هو:

Drawn a Square of Red Color
Drawn a Circle of Blue Color

وملاحظة السهولة التي الألوان الجديدة والأشكال يمكن أن تضاف إلى النظام دون أن يؤدي ذلك إلى انفجار فرعية بسبب التباديل.

وبالنسبة لي اعتقد انه ما من آلية حيث يمكنك تبديل الواجهات. في العالم الحقيقي قد يكون لديك فئة التي يمكن استخدامها واجهة أكثر من واحد، جسر يتيح لك مبادلة.

Bridge design pattern we can easily understand helping of service and dao layer.

Dao layer -> create common interface for dao layer ->
public interface Dao<T>{
void save(T t);
}
public class AccountDao<Account> implement Dao<Account>{
public void save(Account){
}
}
public LoginDao<Login> implement Dao<Login>{
public void save(Login){
}
}
Service Layer ->
1) interface
public interface BasicService<T>{
    void save(T t);
}
concrete  implementation of service -
Account service -
public class AccountService<Account> implement BasicService<Account>{
 private Dao<Account> accountDao;
 public AccountService(AccountDao dao){
   this.accountDao=dao;
   }
public void save(Account){
   accountDao.save(Account);
 }
}
login service- 
public class LoginService<Login> implement BasicService<Login>{
 private Dao<Login> loginDao;
 public AccountService(LoginDao dao){
   this.loginDao=dao;
   }
public void save(Login){
   loginDao.save(login);
 }
}

public class BridgePattenDemo{
public static void main(String[] str){
BasicService<Account> aService=new AccountService(new AccountDao<Account>());
Account ac=new Account();
aService.save(ac);
}
}
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top