الگوی پل، یک الگوی طراحی در مهندسی نرمافزار است که به معنای "جداسازی یک انتزاع از اجرای آن به طوری که این دو بتوانند به صورت مستقل تغییر پذیر باشند."میباشد. این الگو توسط باند چهار نفره (GoF) معرفی شده است.الگوی پل از گروههای قالبدار و گروههای تجمعی و بعضاً ارثبری برای جداسازی مسئولیتها در طبقات مختلف استفاده میکند.
هنگامی که اطلاعات یک کلاس اغلب تغییر کند، ویژگیهای برنامهنویسی شی گرا بسیار مفید خواهد بود، چرا که تغییرات در کد برنامه، میتواند با حداقل اطلاعات از برنامه صورت گیرد. زمانی که کلاسها و کاری که آنها انجام میدهند نسبت به یگدیگر تفاوتهای زیادی داشته باشد، از الگوی پل استفاده میشود. خود کلاس به عنوان انتزاع در نظر گرفته میشود و کاری که انجام میدهد در مرحله پیادهسازی آن است. همچنین الگوی پل میتواند به عنوان دو لایه از انتزاع در نظر گرفته شود زمانی که تنها یک پیادهسازی ثابت امکانپذیر است در زبان C++ این الگو در اصطلاح Pimpl شناخته میشود.
الگوی پل اغلب با الگوی آداپتور اشتباه گرفته میشود. در واقع، الگوی پل اغلب در زبان جاوا توسط کلاس الگوی آداپتور پیادهسازی میشود. مانند مثالی که در ادامه آمده است.
کلاس های دیزاین پترن پل در زیر آمده است
Abstraction کلاس انتزاعی
- رابط انتزاعی را تعریف میکند.
- مجری پیادهسازی را تأمین میکند.
RefinedAbstraction کلاس عادی
- رابط تعریف شده در انتزاع را ارائه میدهد.
Implementor رابط کاربری
- رابط کلاسهای پیادهسازی شده را تعریف میکند.
ConcreteImplementor کلاس عادی
- رابط مجری پیادهسازی را پیادهسازی میکند.
interface DrawingAPI {
function drawCircle($x, $y, $radius);
}
class DrawingAPI1 implements DrawingAPI {
public function drawCircle($x, $y, $radius) {
echo "API1.circle at $x:$y radius $radius.\n";
}
}
class DrawingAPI2 implements DrawingAPI {
public function drawCircle($x, $y, $radius) {
echo "API2.circle at $x:$y radius $radius.\n";
}
}
abstract class Shape {
protected $drawingAPI;
public abstract function draw();
public abstract function resizeByPercentage($pct);
protected function __construct(DrawingAPI $drawingAPI) {
$this->drawingAPI = $drawingAPI;
}
}
class CircleShape extends Shape {
private $x;
private $y;
private $radius;
public function __construct($x, $y, $radius, DrawingAPI $drawingAPI) {
parent::__construct($drawingAPI);
$this->x = $x;
$this->y = $y;
$this->radius = $radius;
}
public function draw() {
$this->drawingAPI->drawCircle($this->x, $this->y, $this->radius);
}
public function resizeByPercentage($pct) {
$this->radius *= $pct;
}
}
class Tester {
public static function main() {
$shapes = array(
new CircleShape(1, 3, 7, new DrawingAPI1()),
new CircleShape(5, 7, 11, new DrawingAPI2()),
);
foreach ($shapes as $shape) {
$shape->resizeByPercentage(2.5);
$shape->draw();
}
}
}
Tester::main();
خروجی
API1.circle at 1:3 radius 17.5
API2.circle at 5:7 radius 27.5
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید