设计模式:Bridge--桥接模式

桥接模式:把事务和具体行为分开,通过bridge桥接调用,实现对接口对应实现的的调用

桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。我们来看看关系图:

就通过对Bridge类的调用,实现了对接口Sourceable的实现类SourceSub1和SourceSub2的调用;

代码:不同的车安装不同的引擎,通过 对引擎结果的引用调用engine,实现了对具体引起的调用,比如2000cc的引擎安装等。

package com.atguigu.bridge.bridgeDemo1;

/**
 * 引擎接口
 */
interface Engine {
    public void installEngine();
}

//2000cc引擎安装
class Engine2000 implements Engine {
    @Override
    public void installEngine() {
        System.out.println("安装2000cc引擎");
    }
}


//2200cc引擎安装
class Engine2200 implements Engine {
    @Override
    public void installEngine() {
        System.out.println("安装2200cc引擎");
    }
}

abstract class Car {
    private Engine engine;

    public Car(Engine engine) {
        this.engine = engine;
    }

    public Engine getEngine() {
        return engine;
    }

    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    public abstract void installEngine();
}


class Bus extends Car {


    public Bus(Engine engine) {
        super(engine);
    }

    @Override
    public void installEngine() {
        System.out.print("Bus:");
        this.getEngine().installEngine();
    }
}

class Jeep extends Car {

    public Jeep(Engine engine) {
        super(engine);
    }

    @Override
    public void installEngine() {
        System.out.print("Jeep:");
        this.getEngine().installEngine();
    }
}

public class MainClass {
    public static void main(String[] args) {
        Engine engine = new Engine2000();

        Car car = new Bus(engine);
        car.installEngine();

        Engine engine1 = new Engine2200();
        Car car1 = new Jeep(engine1);
        car1.installEngine();

    }
}

输出结果:
Bus:安装2000cc引擎
Jeep:安装2200cc引擎

测试结果:

 

二、实例2

/**
 * @auhtor
 * @create 2023-01-10-10:09
 *  画笔
 */
public interface PaintBrush {

    void color();

}

public class Red implements PaintBrush{

    @Override
    public void color() {
        System.out.print("红色画笔");
    }
}

public class Black implements PaintBrush{
    @Override
    public void color() {
        System.out.print("黑色画笔");
    }
}
// 形状抽象类
public abstract class Shape {

    protected PaintBrush paintBrush;

    public Shape(PaintBrush paintBrush) {
        this.paintBrush = paintBrush;
    }

    void draw() {
        paintBrush.color();
    }
}
// 方形
public class Square extends Shape {
    public Square(PaintBrush paintBrush) {
        super(paintBrush);
    }

    @Override
    void draw() {
        super.draw();
        System.out.print(":画方形");
    }
}
// 圆形
public class Circle extends Shape{
    public Circle(PaintBrush paintBrush) {
        super(paintBrush);
    }

    @Override
    void draw() {
        super.draw();
        System.out.print(":画圆形");
    }
}
public class MainClient {
    public static void main(String[] args) {
        PaintBrush red = new Red();
        Shape shape = new Circle(red);
        shape.draw();
    }
}

// console
红色画笔:画圆形

这个图是我们JDBC连接的原理

多个维度扩展就跟jdbc一样可以多次聚合:

比如:如果系统中某对象有三个维度,如某日志记录器既可以支持不同的操作系统,还可以支持多种编程语言,并且可以使用不同的输出方式。请使用桥接模式设计该系统。

 

public abstract class OutPut {

    abstract void outPut(String system, String language);
}


public class ControllerOut extends OutPut{
    @Override
    void outPut(String system, String language) {
        String means="控制台方式输出";
        System.out.println("在"+system+"用"+language+"以"+means);
    }
}

public class FileOut extends OutPut{
    @Override
    void outPut(String system, String language) {
        String means="File方式输出";
        System.out.println("在"+system+"用"+language+"以"+means);
    }
}
public abstract class EncodingLanguage {

    protected OutPut outPut;

    public EncodingLanguage(OutPut outPut) {
        this.outPut = outPut;
    }

    abstract void language(String system);
}


public class C_yuyan extends EncodingLanguage{
    public C_yuyan(OutPut outPut) {
        super(outPut);
    }

    @Override
    void language(String system) {
        String language = "C语言\n";
        outPut.outPut(system, language);
    }
}


public class Java extends EncodingLanguage {
    public Java(OutPut outPut) {
        super(outPut);
    }

    @Override
    void language(String system) {
        String language = "Java语言\n";
        outPut.outPut(system, language);
    }
}
public abstract class OperatingSystem {

    protected EncodingLanguage encodingLanguage;

    public OperatingSystem(EncodingLanguage encodingLanguage) {
        this.encodingLanguage = encodingLanguage;
    }

    abstract void type();
}


public class Linux extends OperatingSystem{
    public Linux(EncodingLanguage encodingLanguage) {
        super(encodingLanguage);
    }

    @Override
    void type() {
        String system="Linux系统";
        encodingLanguage.language(system);
    }
}

public class Windows extends OperatingSystem{
    public Windows(EncodingLanguage encodingLanguage) {
        super(encodingLanguage);
    }

    @Override
    void type() {
        String system="Windows系统";
        encodingLanguage.language(system);
    }
}
public class MainClient {
    public static void main(String[] args) {
        Linux linux = new Linux(new Java(new ControllerOut()));
        linux.type();
    }
}
// console
在Linux系统用Java语言
以控制台方式输出

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值