设计模式 | 桥接模式
时间:2022-07-22
本文章向大家介绍设计模式 | 桥接模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
说明
在开发过程中,我们很多类具都是具有两个或多个维度以上的,例如 图形可以按照形状分,也可以按照颜色分。
在生活中也会出现很多例子,比方说:现需要提供大中小3种型号的画笔,能够绘制5种不同颜色,如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型号的毛笔,外加5个颜料盒,用3+5=8个类就可以实现15支蜡笔的功能。
上面的例子可以很明显的看出来,如果不采用桥接模式的话,我随意增加颜色都会导致代码量急剧增加,并且毫无扩展性可言。我们需要把这种强关联改成弱关联,角色与角色之间应该是可以随意修改。
定义:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
示例
我们常见的,一个手机是可以安装多款软件,多个手机也可以随意安装多款软件,我们不可能让一个手机去只安装一个软件,软件是很灵活的,这个时候我们可以采用桥接模式将抽象部分与它的实现部分分离开来,使他们都可以独立变化。
例如: 我们两个有小米和苹果手机,可以随意安装王者荣耀和刺激战场,安装这个步骤应该是属于十分灵活的,我随时可以安装 当然也可以随时使用不同手机安装,我们来看一下实现
<?php
/**
* Created by 憧憬.
*/
/**
* 游戏抽象
* Class Game
*/
abstract class Game {
protected $game = null;
public function getGame()
{
return $this->game;
}
}
/**
* 手机抽象
* Class Phone
*/
abstract class Phone {
protected $game = null;
public function setGame($game)
{
$this->game = $game;
}
abstract public function play();
}
/**
* 王者荣耀
* Class WangzheRongYao
*/
class WangzheRongYao extends Game {
public function __construct()
{
$this->game = '王者荣耀';
}
}
/**
* 吃鸡
* Class HePingJingYing
*/
class HePingJingYing extends Game {
public function __construct()
{
$this->game = '和平精英';
}
}
/**
* 苹果手机
* Class IosPhone
*/
class IosPhone extends Phone {
public $phone = 'ios phone';
public function play()
{
echo 'use ' . $this->phone . ' play ' . $this->game->getGame();
}
}
/**
* 小米手机
* Class XiaoMiPhone
*/
class XiaoMiPhone extends Phone {
public $phone = 'xiaomi phone';
public function play()
{
echo 'use ' . $this->phone . ' play ' .$this->game->getGame();
}
}
$xiaoMiPhone = new XiaoMiPhone();
$xiaoMiPhone->setGame(new WangzheRongYao());
$xiaoMiPhone->play(); // use xiaomi phone play 王者荣耀
使用场景:
- 你不希望在抽象和他的实现部分之间有一个固定的邦定关系,如在程序的运行时刻实现部分应该可以被选择或者切换。
- 类的抽象以及他的视像都可以通过生成子类的方法加以扩充。这时
bridge
模式使你可以对不同的抽象接口和实现部分进行组合,并对他们进行扩充。 - 对一个抽象的实现部分的修改应该对客户不产生影响,即客户的代码不需要重新编译。
- 你想对客户完全隐藏抽象的实现部分。
- 你想在多个实现间 共享实现,但同时要求客户并不知道这一点。
- 为什么要使用String
- Android网络编程(十一)源码解析Retrofit
- android Material Design详解
- android EventBus详解(三)
- Android绘制优化(一)绘制性能分析
- android EventBus详解(二)
- [置顶] android EventBus详解(一)
- 开源组件photoView学习
- ViewPagerIndicator+viewpager指示器详解
- 实现去哪儿来回机票选择的view
- 解决水平ListView在ScrollView中出现的滑动冲突
- Android逆向分析(2) APK的打包与安装背后的故事
- Activity之间传递大数据问题
- React Native入门(二)Atom+Nuclide安装、配置与调试
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法