设计模式之桥接模式,golang,php实现

程序员卷不动了 2023-03-18 PM 237℃ 0条

桥接模式(Bridge Pattern)是一种结构型设计模式,在该模式中,将一个大类或一系列紧密相关的类拆分成两个独立的层次结构,从而使它们可以独立地进行修改、扩展,也可以通过组合任意一种高层抽象与底层实现,从而实现二者间的桥接。

桥接模式主要包含以下角色:

  1. 抽象化角色(Abstraction):该角色定义抽象类接口,维护一个抽象类成员(即实现被委托的对象),并在其构造函数中注入一个实现的接口,提供一个通用的操作。
  2. 实现化角色(Implementor):该角色定义实现的接口,以供抽象化角色调用。
  3. 具体实现化角色(Concrete Implementor):该角色是实现化角色的具体实现,实现在实现化角色中定义的接口。

桥接模式的优点主要有以下几点:

  1. 桥接模式可以将一个大的类或一组紧密相关的类拆成独立的部分,从而使得代码更加容易理解和维护。
  2. 桥接模式可以在运行时动态地改变一个对象的实现方式,实现对象的可扩展性和可配置性。
  3. 桥接模式可以在不同的平台和系统上具有很好的兼容性。
  4. 桥接模式实现了一个对象的多态性,提高了代码的可复用性和可扩展性。

桥接模式可以将程序的抽象部分与实现部分分离,使得二者可以独立地变化,更加符合面向对象设计的原则。

golang实现

package main

import "fmt"

// Abstraction 
type Shape interface {
    Draw() string
}

// Refined Abstraction 
type Circle struct {
    color Color
}

func (c *Circle) Draw() string {
    return fmt.Sprintf("Drawing a Circle with %s color", c.color.Fill())
}

type Square struct {
    color Color
}

func (s *Square) Draw() string {
    return fmt.Sprintf("Drawing a Square with %s color", s.color.Fill())
}

// Implementation 
type Color interface {
    Fill() string
}

type Red struct{}

func (r *Red) Fill() string {
    return "Red"
}

type Green struct{}

func (g *Green) Fill() string {
    return "Green"
}

func main() {
    redCircle := &Circle{color: &Red{}}
    fmt.Println(redCircle.Draw())  // 输出 "Drawing a Circle with Red color"

    greenSquare := &Square{color: &Green{}}
    fmt.Println(greenSquare.Draw()) // 输出 "Drawing a Square with Green color"
}

php实现

<?php
// 抽象部分
interface Shape {
  public function draw();
}
 
class Circle implements Shape {
  protected $color;
   
  public function __construct(Color $color) {
      $this->color = $color;
  }
 
  public function draw() {
    return "Drawing a Circle with " . $this->color->fill() . " color";
  }
}

class Square implements Shape {
  protected $color;
   
  public function __construct(Color $color) {
      $this->color = $color;
  }
 
  public function draw() {
    return "Drawing a Square with " . $this->color->fill() . " color";
  }
}

// 实现部分
interface Color {
  public function fill();
}
 
class Red implements Color {
  public function fill() {
    return "Red";
  }
}
 
class Green implements Color {
  public function fill() {
    return "Green";
  }
}

// 使用桥接模式将它们连接起来
$redCircle = new Circle(new Red());
echo $redCircle->draw(); // 输出 "Drawing a Circle with Red color"

$greenSquare = new Square(new Green());
echo $greenSquare->draw(); // 输出 "Drawing a Square with Green color"

Shape接口表示抽象部分,Circle和Square表示其实现部分。在实例化时,将Color对象传递给它们,它们在draw()方法中使用该对象。

Color接口表示实现部分,并且Red和Green表示其具体实现。最后,使用桥接模式将它们连接起来,生成相应的对象并执行相关的操作。

标签: none

非特殊说明,本博所有文章均为博主原创。

评论啦~