桥接模式

发布时间: 更新时间: 总字数:1091 阅读时间:3m 作者: IP上海 分享 网址

Decouple an abstraction from its implementation so that two can vary independently。(将抽象和实现解耦,使得两者可以独立地变化。重点就是“解耦”,如何让抽象和实现解耦就是需要了解的重点。)

桥接模式介绍

桥接模式的类图:

bridge pattern

现在来详细介绍下各个角色:

  • Abstract:抽象化角色。主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。
  • Implementor:实现化角色。是接口或者抽象类,定义角色必需的行为和属性。
  • RefinedAbstract:修正抽象化角色。实现接口或抽象类定义的方法和属性。
  • ConcreteImplementor*:具体实现方法类。

桥接模式分析

优点:

  • 分离接口及其实现部分。这也是我的主要特点,毕竟也是为了解决继承的缺点而提出的设计模式嘛。
  • 优秀的扩充能力。
  • 实现细节对客户的透明。因此你们完全不用关心细节的实现,它已经由抽象层通过聚合关系完成了封装。

桥接模式之实现

Golang

Java

首先是抽象APP类:

public abstract class App{
    //首先要设计,什么数据库设计、框架选取、概要设计、详细设计等等
    public abstract void beDesigned();
    //然后是编码实现
    public abstract void beCoded();
    //最后是测试
    public abstract void beTest();
}

假设是社交类APP:

public class ChatApp extends App{
    //首先要设计,什么数据库设计、框架选取、概要设计、详细设计等等
    public abstract void beDesigned(){
        System.out.println("调研,写文档、写文档、、、");
    }
    //然后是编码实现
    public abstract void beCoded(){
        System.out.println("我是一个程序员,加班Coding中");
    }
    //最后是测试
    public abstract void beTest(){
        System.out.println("test、test、test、、、");
    }
}

然后APP产品自然是由互联网公司生产的了,下面是抽象的公司类:

public abstract class Corp{
    //定义一个抽象APP对象,但是不知道具体是什么
    private App app;
    //构造函数,由子类定义传递具体产品
    public Corp(App app){
        this.app = app;
    }

    //制作APP
    public void developApp(){
        this.app.beDesigned();
        this.app.beCoded();
        this.app.beTest();
    }
}

这里是有参构造,因为继承的子类需要重写自己的有参构造函数,把APP的类传进来,首先看一下APP公司的实现:

public class AppCorp extends Corp{
    //生产的App 待定,据需求而定
    public AppCorp(App app){
        super(app);
    }

    //生产App
    public void developApp(){
        super.developApp();
        System.out.println("要什么制作什么APP");
    }
}

具体使用看如下的场景类:

public class Client{
    public static void main(String[] args) {
        AppCorp appCorp = new AppCorp(new ChatApp());
        appCorp.developApp();
    }
}

桥接模式之应用场景

应用场景:

  • 当你不希望抽象和实现之间有一个固定的绑定关系的时候。
  • 类的抽象和它的实现都应该可以通过生成子类的方法加以扩充。
  • 对一个抽象的实现部分的修改应对客户不产生影响。
  • 你想对客户完全隐藏抽象的实现部分。
  • 有许多的类要生成。
  • 你想对多个对象间共享实现,但同时要求客户并不知道这一点。
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数