Java设计模式学习-桥接模式bridge

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40646143/article/details/85142005

 我们可以用多重继承结构实现下图的关系

  这样存在一个问题:

  • 如果要增加一个新的电脑类型, 智能手机 ,则要增加各个品牌下面的类 。
  • 如果要增加一个新的品牌 , 也要增加各种电脑类型的类 。
  • 违反单一职责原则 --  一个类:联想笔记本 ,有俩个引起这个类变化的原因。

我们使用多重继承来实现上图:

package com.tuogo.bridge;

/**电脑类
 * @author 晓电脑
 */
public interface Computer {
    /**
     * 销售
     */
    void sale();
}

//销售台式机
class DesktopComputer implements Computer{

    @Override
    public void sale() {
        System.out.println("销售台式机");
    }
}
//销售联想台式机
class LenovoComputer extends DesktopComputer{
    @Override
    public void sale() {
        System.out.println("销售联想台式机");
    }
}
//销售戴尔台式机
class DellComputer extends DesktopComputer{
    @Override
    public void sale() {
        System.out.println("销售戴尔台式机");
    }
}
//销售神州台式机
class ShenzhouComputer extends DesktopComputer{
    @Override
    public void sale() {
        System.out.println("销售神州台式机");
    }
}

//销售笔记本
class NotebookComputer implements Computer{

    @Override
    public void sale() {
        System.out.println("销售笔记本");
    }
}

//销售联想笔记本
class LenovoNotebookComputer extends NotebookComputer{
    @Override
    public void sale() {
        System.out.println("销售联想笔记本");
    }
}
//销售戴尔笔记本
class DellNotebookComputer extends NotebookComputer{
    @Override
    public void sale() {
        System.out.println("销售戴尔笔记本");
    }
}
//销售神州笔记本
class ShenzhouNotebookComputer extends NotebookComputer{
    @Override
    public void sale() {
        System.out.println("销售神州笔记本");
    }
}

//销售平板
class Flat implements Computer{

    @Override
    public void sale() {
        System.out.println("销售平板");
    }
}
//销售联想平板
class LenovoFlat extends Flat{
    @Override
    public void sale() {
        System.out.println("销售联想平板");
    }
}
//销售戴尔平板
class DellFlat extends Flat{
    @Override
    public void sale() {
        System.out.println("销售戴尔平板");
    }
}
//销售神州平板
class ShenzhouFlat extends Flat{
    @Override
    public void sale() {
        System.out.println("销售神州平板");
    }
}

绘制出uml图,如下

使用多重继承就暴露出一个问题

  • 当你有新的电脑类型如华为电脑,你这时需要在台式机/笔记本/平板 下面都要添加华为这个类型的电脑,在后期维护上,不易维护,而且使类快速膨胀 解决办法使用桥接模式

我们使用桥接模式bridge

1), 创建品牌接口和实现类

package com.tuogo.bridge;

/**品牌类接口
 * @author 晓电脑
 */
public interface Brand {
    void saleBrand();
}

//联想品牌
class LenovoBrand implements Brand{

    @Override
    public void saleBrand() {
        System.out.println("联想品牌");
    }
}
//戴尔品牌
class DellBrand implements Brand{

    @Override
    public void saleBrand() {
        System.out.println("戴尔品牌");
    }
}
//神州品牌
class ShenZhou implements Brand{

    @Override
    public void saleBrand() {
        System.out.println("神州品牌");
    }
}

2),创建桥接类 SaleComputer 类

/**销售电脑类型  分为台式机/笔记本/平板
 * @author 晓电脑
 */
public class SaleComputer {

    protected Brand brand;

    public SaleComputer(Brand brand) {
        this.brand = brand;
    }

    /**
     * 销售电脑
     */
    void saleComputer(){
        brand.saleBrand();
    }
}

//台式机电脑
class DesktopTypeComputer extends SaleComputer{


    public DesktopTypeComputer(Brand brand) {
        super(brand);
    }

    @Override
    void saleComputer() {
        super.saleComputer();
        System.out.println("销售台式机");
    }
}

//笔记本电脑
class NotebookTypeComputer extends SaleComputer{


    public NotebookTypeComputer(Brand brand) {
        super(brand);
    }

    @Override
    void saleComputer() {
        super.saleComputer();
        System.out.println("销售笔记本");
    }
}
//平板电脑
class FlatTypeComputer extends SaleComputer{


    public FlatTypeComputer(Brand brand) {
        super(brand);
    }

    @Override
    void saleComputer() {
        super.saleComputer();
        System.out.println("销售平板");
    }
}

3),创建测试客户端 Client

public class Client {
    public static void main (String[] args) {
        //销售台式机 联想电脑 直接new 出来
        SaleComputer computer = new DesktopTypeComputer(new LenovoBrand());
        computer.saleComputer();

        //销售笔记本 电脑
        NotebookTypeComputer computer1 = new NotebookTypeComputer(new LenovoBrand());
        computer1.saleComputer();

        //这样 电脑的类别 与 电脑品牌 是俩个维度  不管你是增加电脑类别 还是增加电脑品牌 都不需要做那些重复的操作
    }
}

桥接模式的思路大致是这样的

  • 把电脑类型分为一个维度,把品牌分为一个维度 这样你更改一个维度另一个维度不会发生变化 
  • 桥接模式核心是: 处理多层继承结构 , 处理多维度变化的场景 , 将各个维度设计成独立的继承结构 ,使各个维度可以独立的扩展在抽象层建立关联

桥接模式在实际开发中应用场景:

  • 银行日志管理
  • 1)格式分类 : 操作日志 , 交易日志 , 异常日志
  • 2)距离分类 : 本地记录日志 , 异地记录日志 
  • 人力资源系统中的奖金计算模块
  • 1),奖金分类 : 个人奖金 , 团体奖金 , 激励奖金
  • 2),部门分类 : 人事部门 , 销售部门 , 研发部门
  • OA系统中的消息处理
  • 1), 业务类型 : 普通消息 , 加急消息 , 特急消息 
  • 2),发送消息类型 : 站内信 , 短信 , 邮箱

猜你喜欢

转载自blog.csdn.net/qq_40646143/article/details/85142005