zoukankan      html  css  js  c++  java
  • 设计模式

    简介

    场景

    绘制图形时,可以抽象出一个图形类。

    然后,增加新的需求,需要给绘制的图形添加颜色,此时系统引入了两个变化维度。有两种方案:

    • 每种图形提供一套颜色的实现(继承关系)
      继承关系

    • 组合图形和颜色(关联关系)
      关联关系

    对于第一个方案,类的数量会指数级增长,且类之间的继承导致强耦合。第二种方案更优。

    模式定义

    桥接模式(Bridge Pattern)将抽象部分与实现部分分离,使它们都可以独立地变化。

    模式特点

    桥接模式包含四个角色:

    • Abstraction:抽象类
    • RefinedAbstraction:扩充抽象类
    • Implementor:实现类接口
    • ConcreteImplementor:具体实现类

    桥接模式

    优点

    • 分离抽象接口及其实现部分,可以独立变化。
    • 复用性好,易扩展。
    • 符合单一职责原则。

    缺点

    • 系统复杂度增大,聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
    • 使用范围有一定的局限性,需要系统中有两个独立变化的维度。

    PHP 代码示例

    下面例子中,如果要添加新的形状,只需要添加形状类并继承 Shape 即可。如果要添加新的颜色,只需要添加颜色类并继承 Color 即可。

    <?php
    
    abstract class Shape {
        private $color;
    
        public function __construct(Color $color) {
            $this->color = $color;
        }
    
        public abstract function getShape();
    
        public function getColorShape() {
            return $this->color->getColor() . ' ' . $this->getShape() . '<br/>';
        }
    }
    
    class Rect extends Shape {
        public function getShape() {
            return 'Rect';
        }
    }
    
    class Circle extends Shape {
        public function getShape() {
            return 'Circle';
        }
    }
    
    abstract class Color {
        public abstract function getColor();
    }
    
    class Red extends Color {
        public function getColor() {
            return 'Red';
        }
    }
    
    class Blue extends Color {
        public function getColor() {
            return 'Blue';
        }
    }
    
    $rect = new Rect(new Red());
    echo $rect->getColorShape();
    
    $circle = new Circle(new Blue());
    echo $circle->getColorShape();

    输出:

    Red Rect
    Blue Circle
  • 相关阅读:
    CoreData学习-最好的一片文章
    Xcode4.6下添加百度地图ios版(BMapKit)详细教程(_BMKMapManager错误解决)
    NSSearchPathForDirectoriesInDomains用法
    编绎显示Unknown type name “CGFloat” 错误解决方法
    自动调整cell的高度
    sqlMapConfig约束
    PotPlayer左上角信息关闭
    松懈
    sql查询练习
    idea内容补充
  • 原文地址:https://www.cnblogs.com/kika/p/10851562.html
Copyright © 2011-2022 走看看