• 桥接模式


    1.桥接模式简介

    作用:将抽象部分与它的实现部分相分离,使他们都可以独立地变化。

    实现:抽象类依赖实现类。抽象出来一个基类,这个基类里面定义共有的一些行为,形成接口函数,聚合一个基类的指针(说白了就是在一个类中放一个指针来指向另一个对象),通过它来使用另一个类的实现函数。

    使用场景:
    (1)如果一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
    (2)对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
    (3)一个类存在两个独立变化的维度,且这两个维度都需要进行扩展,对于两个独立变化的维度,使用桥接模式再适合不过了。


    优点:
    (1)抽象和实现的分离。 (2)优秀的扩展能力。 (3)实现细节对客户透明。

    2.相关书籍:《大话设计模式》和《设计模式:可复用面向对象软件的基础》

    3.抽象类虽然不能用来实例化对象,但是可以用来定义指针,如下OS是个抽象类。
    OS *o_l1 = new Linux();

    4.以后阅读Android源代码时一旦看到impl就可以认为使用了桥接模式

    5.参考:
    http://www.runoob.com/w3cnote/bridge-pattern2.html
    https://blog.csdn.net/wuzhekai1985/article/details/6670473
    https://www.cnblogs.com/jiese/p/3164940.html

    6.Demo C++实现

    #include <iostream>
    
    using namespace std;
    
    class Computer {
    public:
        virtual void computer_name() = 0;
        virtual void installInfo() = 0;
    };
    
    class OS {
    public:
        virtual void install_os() = 0;
    };
    
    
    
    class Mac : public Computer {
        OS *os_impl;
    public:
        Mac() { this->os_impl = NULL; }
        Mac(OS *os) {
            os_impl = os;
        }
        void computer_name() {
            cout << "Computer Mac: ";
        }
    
        void installInfo() {
            computer_name();
            if (os_impl) {
                os_impl->install_os();
            }
        }
    };
    
    class Lenovo : public Computer {
        OS *os_impl;
    public:
        Lenovo() { this->os_impl = NULL; }
        Lenovo(OS *os) {
            os_impl = os;
        }
        void computer_name() {
            cout << "Computer Lenovo: ";
        }
    
        void installInfo() {
            computer_name();
            if (os_impl) {
                os_impl->install_os();
            }
        }
    };
    
    
    class Linux : public OS {
    public:
        void install_os() {
            cout << "install Linux" << endl;
        }
    };
    
    class Windows : public OS {
    public:
        void install_os() {
            cout << "install Windows" << endl;
        }
    };
    
    int main() {
        OS *o_l1 = new Linux();
        OS *o_w1 = new Windows();
    
        Computer *c_m1 = new Mac(o_l1);
        Computer *c_l1 = new Lenovo(o_w1);
    
        c_m1->installInfo();
        c_l1->installInfo();
    
        return 0;
    }
    
    #if 0
    int main() {
        Linux *o_l1 = new Linux();
        Windows *o_w1 = new Windows();
    
        Mac *c_m1 = new Mac(o_l1);
        Lenovo *c_l1 = new Lenovo(o_w1);
    
        c_m1->installInfo();
        c_l1->installInfo();
    
        return 0;
    }
    #endif

    7.Demo Java实现

    abstract class Shape {
        Color color;
     
        public void setColor(Color color) {
            this.color = color;
        }
        
        public abstract void draw();
    }
    
    class Rectangle extends Shape{
     
        public void draw() {
            color.bepaint("长方形");
        }
     
    }
    
    class Square extends Shape{
     
        public void draw() {
            color.bepaint("正方形");
        }
     
    }
    
    
    interface Color {
        public void bepaint(String shape);
    }
    
    class White implements Color{
     
        public void bepaint(String shape) {
            System.out.println("白色的" + shape);
        }
     
    }
    
    class Black implements Color{
     
        public void bepaint(String shape) {
            System.out.println("黑色的" + shape);
        }
    }
    
    
    public class Client {
        public static void main(String[] args) {
    
            Color white = new White();
            Color Black = new Black();
    
            Shape square = new Square();
            Shape rectange = new Rectangle();
    
            //白色的正方形
            square.setColor(white);
            square.draw();
     
            rectange.setColor(Black);
            rectange.draw();
        }
    }
  • 相关阅读:
    Linux内核源码分析方法
    OVS处理upcall流程分析
    Linux内核源码目录结构分析
    理解OpenStack中的OpenvSwitch的几个要点
    OVS源码connmgr_run分析
    ovs-appctl 命令合集
    云计算底层技术-使用openvswitch
    OVS架构
    Open vSwitch Datapath浅析
    Openvswitch原理与代码分析(4):网络包的处理过程
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/10661440.html
Copyright © 2020-2023  润新知