zoukankan      html  css  js  c++  java
  • 结构型设计模式(二)桥接模式

    一、一句话背景

    假如我有一个画图工具,这个画图工具可以画各种图形,各种图形又可以扩展各种颜色,那么对于这个场景,形状和颜色都是可拓展的,结合起来时,使用一个桥接器,实现各自管理各自维度的拓展就比较合理了。

    PS:若直接从图形类型、颜色去扩展Shape类,耦合度会很高,这里的桥接器承担了图形颜色的拓展,此时Shape类(抽象部分)不再关心它自己要怎么实现,反正实现就根据传入的DrawAPI对象(实现部分)去愉快的玩耍就好了,这就实现了解耦。

    二、使用场景

    对于两个独立变化的维度,使用桥接模式再适合不过了。

    如:一个业务多维度扩展时可考虑桥接模式进行解决。

    三、模型分析

    桥接器:用于减少耦合

    图形类(Shape类) :优化前:需要对图形类别(第一层维度)、颜色(第二层维度)都进行拓展,那图形类就会

                   有非常多的个性化实例。

            优化后:设置了一个入参为DrawAPI对象的构造方法,应用于多维度的图形拓展场景。引入了

                桥接器以后,只对图形类别(第一层维度)进行拓展,颜色(第二层维度)的拓展由

                桥接器负责,实现解耦。

    个性化图形:Shape类的个性化拓展,只进行图形类别(第一层维度)的拓展

    个性化颜色:桥接器的个性化拓展,用于分担更细化的维度,颜色(第二层维度)的拓展

    四、代码分析

    桥接器

    /**
     * 桥接接口,定义了各种画图形的方法,实现此接口即是对颜色的拓展
     */
    public interface DrawAPI {
        //画个圆
        void drawCircle(int radius, int x, int y);
    
        //画个正方形
        void drawSquare(int x, int y);
    }

    图形类 (Shape类)

    /**
     * 图形类
     */
    public abstract class Shape {
        protected DrawAPI drawAPI;
    
        //构造方法,传入一个扩展后的个性化图形对象
        protected Shape(DrawAPI drawAPI) {
            this.drawAPI = drawAPI;
        }
    
        //图形类的画画方法
        public abstract void draw();
    }

    个性化图形

    /**
     * 圆形类
     */
    public class Circle extends Shape {
        private int x, y, radius;
    
        //圆形类构造方法
        public Circle(int x, int y, int radius, DrawAPI drawAPI) {
            super(drawAPI);
            this.x = x;
            this.y = y;
            this.radius = radius;
        }
    
        //圆形类的画画方法
        public void draw() {
            drawAPI.drawCircle(radius, x, y);
        }
    }
    /**
     * 正方形类
     */
    public class Square extends Shape {
        private int x, y;
    
        //正方形类构造方法
        public Square(int x, int y, DrawAPI drawAPI) {
            super(drawAPI);
            this.x = x;
            this.y = y;
        }
    
        //正方形类的画画方法
        public void draw() {
            drawAPI.drawSquare(x, y);
        }
    }

    个性化颜色

    /**
     * 原谅色圆形
     */
    public class GreenCircle implements DrawAPI {
        @Override
        public void drawCircle(int radius, int x, int y) {
            System.out.println("画一个原谅色圆形~");
        }
    
        @Override
        public void drawSquare(int x, int y) {
            //画不出来!我是正经的原谅色圆形!
        }
    }
    /**
     * 原谅色正方形
     */
    public class GreenSquare implements DrawAPI {
        @Override
        public void drawCircle(int radius, int x, int y) {
            //画不出来!我是正经的原谅色正方形!
        }
    
        @Override
        public void drawSquare(int x, int y) {
            System.out.println("画一个原谅色正方形~");
        }
    }
    /**
     * 红色圆形
     */
    public class RedCircle implements DrawAPI {
        @Override
        public void drawCircle(int radius, int x, int y) {
            System.out.println("画一个红色圆形~");
        }
    
        @Override
        public void drawSquare(int x, int y) {
            //画不出来!我是正经的红色圆形!
        }
    }

    模拟调用画图

    /**
     * 模拟画画
     */
    public class BridgePatternDemo {
        public static void main(String[] args) {
            Shape redCircle = new Circle(100, 100, 10, new RedCircle());
            Shape greenCircle = new Circle(100, 100, 10, new GreenCircle());
            Shape greenSquare = new Square(100, 100, new GreenSquare());
    
            redCircle.draw();
            greenCircle.draw();
            greenSquare.draw();
        }
    }

     

  • 相关阅读:
    java中的Set的使用以及各种遍历方法(较为全面)
    系统图标
    监听按钮
    GUI
    【Avalon】获取隐藏元素的尺寸
    Hooks
    特性节点Attribute
    ngCloak
    邮件
    时间
  • 原文地址:https://www.cnblogs.com/riches/p/11234535.html
Copyright © 2011-2022 走看看