• 结构型模式


    桥接模式(Bridge Pattern)

    意图

    将抽象部分与实现部分分离,使得它们都可以独立变化。

    适用场景

    一个类如果有2个维度或者多个维度的扩展,用继承没有问题,但是用桥接模式会更适合。避免2个层次之间建立静态继承联系。

    • 什么是抽象部分,什么是实现部分?
      比如,要绘制矩形、圆形、正方形,至少需要3个形状类,但是如果绘制的图形有不同颜色,如红色、蓝色、绿色灯,需要为每个形状类又继承3个子类。这样就要扩展3+9个类。
      这里的形状是抽象,具体的实现矩形、圆形、正方形;另外一个就是颜色,具体的实现就是红蓝绿色。桥接模式就是使形状和颜色能独立的变化,不会出现每修改一个颜色,都要影响形状类的变化;同样地,修改形状,也不会影响颜色的变化。不至于出现红色矩形类、蓝色圆形类、绿色正方形类,这样颜色和形状就没有分离。

    另外一种好的方案是,将形状和颜色分离,也就是将形状、颜色从继承关系转换为关联关系。

    适配器模式 vs 桥接模式

    桥接模式适用于系统的初步设计,对存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使他们可以分别进变化。在初步设计完成后,发现系统已有类无法协同工作时,可以用适配器模式,解决接口不兼容问题,特别是涉及到第三方应用接口的情况。

    UML类图

    实现代码

    1. 创建接口Color
    // Color.java
    public interface Color {
        public void bepaint();
    }
    
    1. 创建接口Color实现类,Red, Green, Blue
    // Red.java
    public class Red implements Color{
        public void bepaint()
        {
            System.out.println("Color is Red ");
        }
    }
    
    // Green.java
    public class Green implements Color{
        public void bepaint()
        {
            System.out.println("Color is Green ");
        }
    }
    
    // Blue.java
    public class Blue implements Color{
        public void bepaint()
        {
            System.out.println("Color is Blue ");
        }
    }
    
    1. 使用Color接口创建抽象类Shape
    // Shape.java
    public abstract class Shape {
        protected Color color;
        
        public Shape(Color color)
        {
            this.color = color;
        }
    
        public abstract void draw();
    }
    
    1. 创建实现了Shape的实体类Circle, Retangle, Square
    // Circle.java
    public class Circle extends Shape {
        @Override
        public void draw()    {
            System.out.println("Shape is Circle");
            color.bepaint();
        }
    }
    
    // Retangle.java
    public class Retangle extends Shape {
        @Override
        public void draw()
        {
            System.out.println("Shape is Retangle");
            color.bepaint();
        }
    }
    
    // Square.java
    public class Square extends Shape {
        @Override
        public void draw()
        {
            System.out.println("Shape is Square");
            color.bepaint();
        }
    }
    
    1. 创建BridgePatternDemo,绘制不同颜色的Shape
    // BridgePatternDemo.java
    public class BridgePatternDemo{
        public static void main(String[] args) {
            Shape redCircle = new Circle(new Red());
            Shape blueSquare = new Square(new Blue());
            redCircle.draw();
            System.out.println("===");
            blueSquare.draw();                
        }
    }
    

    运行结果

    Shape is Circle
    Color is Red
    ===
    Shape is Square
    Color is Blue
    
  • 相关阅读:
    Helvetic Coding Contest 2016 online mirror D1
    Helvetic Coding Contest 2016 online mirror C1
    Helvetic Coding Contest 2016 online mirror A1
    Educational Codeforces Round 13 C
    Educational Codeforces Round 13 B
    Educational Codeforces Round 13 A
    2016计蒜之道初赛第四场A
    帆软出品: 7点搞定制药企业数据分析系统开发需求
    制药企业BI系统方案整体设计分享
    Ubuntu ROS Arduino Gazebo学习镜像iso说明(indigo版)
  • 原文地址:https://www.cnblogs.com/fortunely/p/14265044.html
Copyright © 2020-2023  润新知