ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 示例 <details> <summary>main.php</summary> ``` <?php interface Implementation { public function operationImplementation(): string; } class Abstraction { /** * @var Implementation */ protected $implementation; public function __construct(Implementation $implementation) { $this->implementation = $implementation; } public function operation(): string { return "Abstraction: Base operation with:\n" . $this->implementation->operationImplementation(); } } class ExtendedAbstraction extends Abstraction { public function operation(): string { return "ExtendedAbstraction: Extended operation with:\n" . $this->implementation->operationImplementation(); } } class ConcreteImplementationA implements Implementation { public function operationImplementation(): string { return "ConcreteImplementationA: Here's the result on the platform A.\n"; } } class ConcreteImplementationB implements Implementation { public function operationImplementation(): string { return "ConcreteImplementationB: Here's the result on the platform B.\n"; } } function clientCode(Abstraction $abstraction) { // ... echo $abstraction->operation(); // ... } $implementation = new ConcreteImplementationA(); $abstraction = new Abstraction($implementation); clientCode($abstraction); echo "\n"; $implementation = new ConcreteImplementationB(); $abstraction = new ExtendedAbstraction($implementation); clientCode($abstraction); ``` </details> <br /> 输出 ``` Abstraction: Base operation with: ConcreteImplementationA: Here's the result on the platform A. ExtendedAbstraction: Extended operation with: ConcreteImplementationB: Here's the result on the platform B. ``` ### 渲染层 页面层作为抽象部分, 而渲染层则作为实现部分 <details> <summary>main.php</summary> ``` <?php namespace RefactoringGuru\Bridge\RealWorld; interface Renderer { public function renderTitle(string $title): string; public function renderTextBlock(string $text): string; public function renderImage(string $url): string; public function renderLink(string $url, string $title): string; public function renderHeader(): string; public function renderFooter(): string; public function renderParts(array $parts): string; } abstract class Page { /** * @var Renderer */ protected $renderer; public function __construct(Renderer $renderer) { $this->renderer = $renderer; } public function changeRenderer(Renderer $renderer): void { $this->renderer = $renderer; } abstract public function view(): string; } class ProductPage extends Page { protected $product; public function __construct(Renderer $renderer, Product $product) { parent::__construct($renderer); $this->product = $product; } public function view(): string { return $this->renderer->renderParts([ $this->renderer->renderHeader(), $this->renderer->renderTitle($this->product->getTitle()), $this->renderer->renderTextBlock($this->product->getDescription()), $this->renderer->renderImage($this->product->getImage()), $this->renderer->renderLink("/cart/add/" . $this->product->getId(), "Add to cart"), $this->renderer->renderFooter() ]); } } class Product { private $id, $title, $description, $image, $price; public function __construct( string $id, string $title, string $description, string $image, float $price ) { $this->id = $id; $this->title = $title; $this->description = $description; $this->image = $image; $this->price = $price; } public function getId(): string { return $this->id; } public function getTitle(): string { return $this->title; } public function getDescription(): string { return $this->description; } public function getImage(): string { return $this->image; } public function getPrice(): float { return $this->price; } } class HTMLRenderer implements Renderer { public function renderTitle(string $title): string { return "<h1>$title</h1>"; } public function renderTextBlock(string $text): string { return "<div class='text'>$text</div>"; } public function renderImage(string $url): string { return "<img src='$url'>"; } public function renderLink(string $url, string $title): string { return "<a href='$url'>$title</a>"; } public function renderHeader(): string { return "<html><body>"; } public function renderFooter(): string { return "</body></html>"; } public function renderParts(array $parts): string { return implode("\n", $parts); } } class JsonRenderer implements Renderer { public function renderTitle(string $title): string { return '"title": "' . $title . '"'; } public function renderTextBlock(string $text): string { return '"text": "' . $text . '"'; } public function renderImage(string $url): string { return '"img": "' . $url . '"'; } public function renderLink(string $url, string $title): string { return '"link": {"href": "' . $title . '", "title": "' . $title . '""}'; } public function renderHeader(): string { return ''; } public function renderFooter(): string { return ''; } public function renderParts(array $parts): string { return "{\n" . implode(",\n", array_filter($parts)) . "\n}"; } } function clientCode(Page $page) { // ... echo $page->view(); // ... } /** * The client code can be executed with any pre-configured combination of the * Abstraction+Implementation. */ $HTMLRenderer = new HTMLRenderer(); $JSONRenderer = new JsonRenderer(); $product = new Product("123", "Star Wars, episode1", "A long time ago in a galaxy far, far away...", "/images/star-wars.jpeg", 39.95); $page = new ProductPage($HTMLRenderer, $product); clientCode($page); echo "\n\n"; $page->changeRenderer($JSONRenderer); clientCode($page); ``` </details> <br /> 输出 ``` <html><body> <h1>Star Wars, episode1</h1> <div class='text'>A long time ago in a galaxy far, far away...</div> <img src='/images/star-wars.jpeg'> <a href='/cart/add/123'>Add to cart</a> </body></html> { "title": "Star Wars, episode1", "text": "A long time ago in a galaxy far, far away...", "img": "/images/star-wars.jpeg", "link": {"href": "Add to cart", "title": "Add to cart""} } ```