zoukankan      html  css  js  c++  java
  • 学习设计模式之桥接模式

    桥接模式
    在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?这就要使用桥接模式。而具体使用的方式,则是将抽象部分与他们的实现部分分离,使得它们都可以独立的变化。

    什么才是抽象部分与它的实现分离呢,并不是说将抽象类和实现类分离。实现指的是抽象类和它的实现类用来实现自己的对象。

    类结构图
    桥接模式类结构图
    Abstraction
    抽象部分
    RefinedAbstraction
    被提炼的抽象
    Implementor
    实现部分
    ConcreteImplementorA、ConcreteImplementorB
    具体实现

    从上图来看抽象部分的具体行为交给了实现部分,举个栗子笔记本有很多品牌,笔记本可以安装很多软件,那么可以分为笔记本品牌和笔记本软件抽象类,让不同的品牌和功能分别继承于他们。这样的话要增加新的品牌或新的功能都不用影响到其他类了。笔记本品牌包含软件,但软件不是品牌的一部分,所以它们之间是聚合关系。

    在这里插入图片描述
    代码示例

    public interface NotebookSoft {
        void run();
    }
    
    public class NotebookSoftA implements NotebookSoft {
        @Override
        public void run() {
            System.out.println("运行 A 软件!");
        }
    }
    
    public class NotebookSoftB implements NotebookSoft {
        @Override
        public void run() {
            System.out.println("运行 B 软件!");
        }
    }
    
    public abstract class Notebook {
    
        private NotebookSoft notebookSoft;
    
        public void setNotebookSoft(NotebookSoft notebookSoft) {
            this.notebookSoft = notebookSoft;
        }
    
        public NotebookSoft getNotebookSoft() {
            return notebookSoft;
        }
    
        public abstract void run();
    }
    
    public class NotebookA extends Notebook {
        @Override
        public void run() {
            System.out.println("A 笔记本开始运行!");
            super.getNotebookSoft().run();
        }
    }
    
    public class NotebookB extends Notebook {
        @Override
        public void run() {
            System.out.println("B 笔记本开始运行!");
            super.getNotebookSoft().run();
        }
    }
    

    客户端示例

    public class Client {
        public static void main(String[] args) {
            Notebook notebook = new NotebookA();
            notebook.setNotebookSoft(new NotebookSoftA());
            notebook.run();
            notebook.setNotebookSoft(new NotebookSoftB());
            notebook.run();
    
            notebook = new NotebookB();
            notebook.setNotebookSoft(new NotebookSoftA());
            notebook.run();
            notebook.setNotebookSoft(new NotebookSoftB());
            notebook.run();
        }
    }
    

    运行结果

    A 笔记本开始运行!
    运行 A 软件!
    A 笔记本开始运行!
    运行 B 软件!
    B 笔记本开始运行!
    运行 A 软件!
    B 笔记本开始运行!
    运行 B 软件!
    
    Process finished with exit code 0
    

    优点

    1. 分离抽象接口及其实现部分。提高了比继承更好的解决方案。
    2. 扩展更加的容易,符合对修改关闭对扩展开放。

    缺点
    桥接模式的引入会增加系统的理解与复杂度。

  • 相关阅读:
    DRF项目创建流程(1)
    RESTful API规范
    超哥笔记--shell 基本命令(4)
    转:django模板标签{% for %}的使用(含forloop用法)
    自定django登录跳转限制
    jquery Ajax应用
    js重定向跳转页面
    django项目mysql中文编码问题
    python进阶(六) 虚拟环境git clone报错解决办法
    Linux基础(六) Vim之vundle插件
  • 原文地址:https://www.cnblogs.com/liufeichn/p/11961637.html
Copyright © 2011-2022 走看看