22 桥接模式
来源:互联网 发布:淘宝图片空间满了 编辑:程序博客网 时间:2024/05/22 04:55
将抽象部分与实现部分分离,使它们都可以独立的变化。
将抽象部分与实现部分分离,使它们都可以独立的变化。
8.实现
模拟毛笔:
现需要提供大中小3种型号的画笔,能够绘制5种不同颜色,如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型号的毛笔,外加5个颜料盒,用3+5=8个类就可以实现15支蜡笔的功能。
实际上,蜡笔和毛笔的关键一个区别就在于笔和颜色是否能够分离。即将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。关键就在于能否脱耦。蜡笔的颜色和蜡笔本身是分不开的,所以就造成必须使用15支色彩、大小各异的蜡笔来绘制图画。而毛笔与颜料能够很好的脱耦,各自独立变化,便简化了操作。在这里,抽象层面的概念是:"毛笔用颜料作画",而在实现时,毛笔有大中小三号,颜料有红绿蓝黑白等5种,于是便可出现3×5种组合。每个参与者(毛笔与颜料)都可以在自己的自由度上随意转换。
蜡笔由于无法将笔与颜色分离,造成笔与颜色两个自由度无法单独变化,使得只有创建15种对象才能完成任务。
Bridge模式将继承关系转换为组合关系,从而降低了系统间的耦合,减少了代码编写量。
UML如图:
代码实现:
- <?php
- /******************************Abstraction **************************/
- /**
- *
- * Abstraction抽象类的接口
- * @author guisu
- *
- */
- abstract class BrushPenAbstraction {
- protected $_implementorColor = null;
- /**
- *
- * Enter description here ...
- * @param Color $color
- */
- public function setImplementorColor(ImplementorColor $color) {
- $this->_implementorColor = $color;
- }
- /**
- *
- * Enter description here ...
- */
- public abstract function operationDraw();
- }
- /******************************RefinedAbstraction **************************/
- /**
- *
- * 扩充由Abstraction;大毛笔
- * @author guisu
- *
- */
- class BigBrushPenRefinedAbstraction extends BrushPenAbstraction {
- public function operationDraw() {
- echo 'Big and ', $this->_implementorColor->bepaint (), ' drawing';
- }
- }
- /**
- *
- * 扩充由Abstraction;中毛笔
- * @author guisu
- *
- */
- class MiddleBrushPenRefinedAbstraction extends BrushPenAbstraction {
- public function operationDraw() {
- echo 'Middle and ', $this->_implementorColor->bepaint (), ' drawing';
- }
- }
- /**
- *
- * 扩充由Abstraction;小毛笔
- * @author guisu
- *
- */
- class SmallBrushPenRefinedAbstraction extends BrushPenAbstraction {
- public function operationDraw() {
- echo 'Small and ', $this->_implementorColor->bepaint(), ' drawing';
- }
- }
- /******************************Implementor **************************/
- /**
- * 实现类接口(Implementor)
- *
- * @author mo-87
- *
- */
- class ImplementorColor {
- protected $value;
- /**
- * 着色
- *
- */
- public function bepaint(){
- echo $this->value;
- }
- }
- /******************************oncrete Implementor **************************/
- class oncreteImplementorRed extends ImplementorColor {
- public function __construct() {
- $this->value = "red";
- }
- /**
- * 可以覆盖
- */
- public function bepaint() {
- echo $this->value;
- }
- }
- class oncreteImplementorBlue extends ImplementorColor {
- public function __construct() {
- $this->value = "blue";
- }
- }
- class oncreteImplementorGreen extends ImplementorColor {
- public function __construct() {
- $this->value = "green";
- }
- }
- class oncreteImplementorWhite extends ImplementorColor {
- public function __construct() {
- $this->value = "white";
- }
- }
- class oncreteImplementorBlack extends ImplementorColor {
- public function __construct() {
- $this->value = "black";
- }
- }
- /**
- *
- * 客户端程序
- * @author guisu
- *
- */
- class Client {
- public static function Main() {
- //小笔画红色
- $objRAbstraction = new SmallBrushPenRefinedAbstraction();
- $objRAbstraction->setImplementorColor(new oncreteImplementorRed());
- $objRAbstraction->operationDraw();
- }
- }
- Client::Main();
跨平台视频播放器:两个维度的变化,平台和不同格式的视频文件:
9. 桥接模式与其他相关模式
10. 总结1)抽象工厂(Abstract Factory 模式可以用来创建和配置一个特定的Bridge模式。
2)Adapter模式 用来帮助无关的类协同工作,它通常在系统设计完成后才会被使用。然而,Bridge模式则是在系统开始时就被使用,它使得抽象接口和实现部分可以独立进行改变。
3)桥接模式与装饰的区别:
装饰模式:
这两个模式在一定程度上都是为了减少子类的数目,避免出现复杂的继承关系。但是它们解决的方法却各有不同,装饰模式把子类中比基类中多出来的部分放到单独的类里面,以适应新功能增加的需要,当我们把描述新功能的类封装到基类的对象里面时,就得到了所需要的子类对象,这些描述新功能的类通过组合可以实现很多的功能组合 .
桥接模式:
桥接模式则把原来的基类的实现化细节抽象出来,在构造到一个实现化的结构中,然后再把原来的基类改造成一个抽象化的等级结构,这样就可以实现系统在多个维度上的独立变化 。
Bridge模式是一个非常有用的模式,也非常复杂,它很好的符合了开放-封闭原则和优先使用对象,而不是继承这两个面向对象原则。
- 22 桥接模式
- 设计模式:适配器模式,桥接模式
- 设计模式----桥接模式
- 设计模式---桥接模式
- 结构性模式-桥接模式
- 设计模式:桥接模式
- 设计模式 桥接模式
- 设计模式 - 桥接模式
- 设计模式--桥接模式
- 设计模式--桥接模式
- 设计模式 - 桥接模式
- 设计模式-桥接模式
- 设计模式 - 桥接模式
- 设计模式 - 桥接模式
- 【设计模式-桥接模式】
- 设计模式:桥接模式
- 【设计模式】----桥接模式
- 【设计模式】桥接模式
- WPF中使用WebBrowser Com组件,实现动态HTML抽取。
- poj 1719Shooting Contest
- 程序猿:喜欢与聪明的同事们在一起搞软件开发
- WEEKLY TRAINING2-B Party 树+dfs
- XML解析PULL
- 22 桥接模式
- Eloquent ORM
- 十道海量数据处理面试题与十个方法大总结
- Javac编译时报“非法的前向引用”,以及Eclipse自带的Java编译器的缺陷
- Majority Element (easy)
- ubuntu下快速使用protobuf
- 关于Intent的其它东西
- 第2周项目长方柱类
- Android开发_Handler