• Java设计模式学习记录-桥接模式


    前言

    这次介绍结构型设计模式中的第二种模式,桥接模式。 使用桥接模式的目的就是为了解耦,松散的耦合更利于扩展,但是会增加相应的代码量和设计难度。

    桥接模式

    桥接模式是为了将抽象化与实现化解耦,让二者可以独立地变化。方便对每一部分的扩展,以及单独的维护。抽象化的一方与实现化的一方之间建立一个桥梁,这样两者的依赖关系就可以通过这个桥梁来建立了。

    举例

    三个小动物要过河,分别是小猪,小鸡,小马,小猪要去河对面的空地晒太阳,小鸡要去河对面的小树林里找虫子吃,小马要去河对面的草地里吃草。那么它们三个都要经过小桥才能过河。有了场景下面来说一下代码的实现,先创建一个小桥的接口。

    /**
     * 小桥
     */
    public interface Bridge {
    
        /**
         * 目的地
         */
        void targetLand();
    }

    因为三个小动物的目的地不一样,所以每一个目的地对应一个实现。

    小猪的目的地

    /**
     * 空地
     */
    public class VacantLand implements Bridge{
    
        /**
         * 目的地
         */
        @Override
        public void targetLand() {
            System.out.println("空旷的地方,晒太阳");
        }
    }

    小鸡的目的地

    /**
     * 小树林
     */
    public class Forest implements Bridge{
    
        /**
         * 目的地
         */
        @Override
        public void targetLand() {
            System.out.println("小树林,觅食。");
        }
    }

    小马的目的地

    /**
     * 草地
     */
    public class Grassland implements Bridge{
        /**
         * 目的地
         */
        @Override
        public void targetLand() {
            System.out.println("大草原,尽情奔腾。");
        }
    }

    下面来实现抽象化的部分,每个小动物都要过桥去往不同的目的地,所以它们都要相同的过桥行为。所以定义一个动物抽象类。

    /**
     * 小动物
     */
    public abstract class Animal {
    
        /**
         * 桥
         */
        Bridge bridge;
    
        /**
         * 过桥
         */
        abstract void willToDo();
    }

    小猪

    /**
     * 小猪
     */
    public class Piglet extends Animal {
        /**
         * 过桥
         */
        @Override
        public void willToDo() {
            System.out.println("我是小猪要过桥去 ");
        }
    }

    小鸡

    /**
     * 小鸡
     */
    public class Chick extends Animal {
        /**
         * 过河桥
         */
        @Override
        public void willToDo() {
            System.out.println("我是小鸡要过桥去 ");
        }
    }

    小马

    /**
     * 小马
     */
    public class Pony extends Animal {
        /**
         * 过桥
         */
        @Override
        public void willToDo() {
            System.out.println("我是小马要过桥去 ");
        }
    }

    测试例子

    public class TestBridge {
    
        public static void main(String[] args) {
    
            Animal animal = new Chick();
    
            animal.bridge = new Forest();
            animal.willToDo();
            animal.bridge.targetLand();
        }
    }

    运行结果

    我是小鸡要过桥去 
    小树林,觅食。

    这就是一个完整的桥接模式的例子,这样使得小动物和要去的目的地解耦了。如果再来了一个小动物,例如小鸭子,它只需要继承Animal类即可,如果它的目的地已经存在了就直接使用现有的目的地类,如果要去的目的地不存在(例如小鸭子要去池塘),那么可以再创建一个池塘的目的地,然后实现自Bridge就可以了。

    结构

    下面来介绍一下桥接模式的结构,如下图所示。

     从上面的结构图中我们可以看出来,桥接模式其实是分为四个角色的。

    抽象化角色(Animal类):定义抽象化,并保存一个对实现化对象的引用。

    抽象化扩展角色(Chick、Piglet、Pony等具体的小动物类):实现和扩展抽象化角色的功能。

    实现化角色(Bridge接口):此角色给出了实现化角色的接口,定义了实现化角色的行为。

    具体实现化角色(VacantLand、GrassLand、Forest等目的地类):实现化角色接口的具体实现类。

    桥接模式的优缺点 

    优点

    1、分离抽象和实现部分:

    分离了抽象和实现部分,提高了系统的灵活性,这样有助于对系统进行分层,从而产生更好的结构化的系统。

    2、更好的扩展性:

    因为抽象部分和实现部分分离开了,所以这两部分可以独立扩展,互不影响,大大提高了系统的可扩展性。

    3、可动态切换:

    由于分离了抽象和实现,那么在实现桥接的时候,可以实现动态的选择和使用具体的实现,也就是在运行期间动态切换实现。

    4、减少了子类的数量:

    从抽象和实现两个维度来看,如果不是用桥接模式的话,这两个维度的子类,在发生变化时影响到的数量是两个维度子类的乘积。而使用了桥接模式后影响到的数量是两个维度的子类的和。

    缺点

    增加了系统的理解和设计难度,入手并不是那么容易了,因为聚合关系定义在抽象层,所以需要开发者对抽象进行设计和编程。

    想了解更多的设计模式请查看Java设计模式学习记录-GoF设计模式概述

  • 相关阅读:
    vue去除#号tomcat配置
    vscode配置
    git忽略想要提交的文件
    vue-cli配置移动端自适应
    远程调试工具 -- weinre
    将博客搬至CSDN
    错误:this dependency was not found:'element-ui/lib/theme-chalk/index.css'。。。。。。。
    win上java1.7和1.8版本修改环境变量无效.md
    mysql 事务
    mysql 函数
  • 原文地址:https://www.cnblogs.com/jimoer/p/9310808.html
Copyright © 2020-2023  润新知