Java设计模式之桥接模式

  • 桥接模式

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

  • 适用性

    1)你不希望在抽象和它的实现部分之间有一个固定的绑定关系。
    例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
    2)类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。
    这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
    3)对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
    4)你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。

  • 举例

    1)一个公司,有产品,具体有服装公司、汽车公司、食品公司等。
    2)一个产品,具体可以包含服装、汽车、食品等。

  • UML类图
    桥接模式(Bridge)

  • 代码示例

    • 定义一个产品抽象类
      package com.jin.demo.DesignPatterns.Bridge;
      
      /**
       * 产品
       * @auther jinsx
       * @date 2019-05-07 09:02
       */
      public abstract class Product {
      
          // 不管什么产品,都要生产
          public abstract void make();
          // 不管什么产品,都要销售
          public abstract void sell();
      
      }
      
    • 定义产品具体实现
      内衣
      package com.jin.demo.DesignPatterns.Bridge;
      
      /**
       * @auther jinsx
       * @date 2019-05-07 09:14
       */
      public class Shirt extends Product {
      
          @Override
          public void make() {
              System.out.println("生产内衣衬衫");
          }
      
          @Override
          public void sell() {
              System.out.println("内衣衬衫卖出去啦...");
          }
      }
      
      外套
      package com.jin.demo.DesignPatterns.Bridge;
      
      /**
       * @auther jinsx
       * @date 2019-05-07 09:09
       */
      public class Jacket extends Product {
      
          @Override
          public void make() {
              System.out.println("生产外套恰克");
          }
      
          @Override
          public void sell() {
              System.out.println("外套恰克卖出去啦...");
          }
      }
      
    • 定义一个公司抽象类,并维护指向产品对象的指针
      package com.jin.demo.DesignPatterns.Bridge;
      
      /**
       * 我是一个公司
       * @auther jinsx
       * @date 2019-05-07 09:24
       */
      public abstract class Corp {
          // 我要生产服装
          private Product product;
      
          public Corp(Product product) {
              this.product = product;
          }
          // 公司是用来挣钱的
          public void makeMoney(){
              this.product.make();
              this.product.sell();
          }
      }
      
    • 创建一个具体的公司,服装公司
      package com.jin.demo.DesignPatterns.Bridge;
      
      /**
       * 这是一个服装公司
       * @auther jinsx
       * @date 2019-05-07 09:28
       */
      public class ClothingCorp extends Corp {
      
          public ClothingCorp(Product product) {
              super(product);
          }
      
          @Override
          public void makeMoney() {
              super.makeMoney();
              System.out.println("服装公司挣大钱啦...");
          }
      }
      
    • 创建一个测试类
      package com.jin.demo.DesignPatterns.Bridge;
      
      /**
       * @auther jinsx
       * @date 2019-05-07 09:31
       */
      public class TestBridge {
      
          public static void main(String[] args) {
              System.out.println("---外套这样挣钱---");
              ClothingCorp shirt = new ClothingCorp(new Shirt());
              shirt.makeMoney();
      
              System.out.println("---内衣这样挣钱---");
              ClothingCorp jacket = new ClothingCorp(new Jacket());
              jacket.makeMoney();
          }
      }
      
    • 执行测试结果
      ---外套这样挣钱---
      生产内衣衬衫
      内衣衬衫卖出去啦...
      服装公司挣大钱啦...
      ---内衣这样挣钱---
      生产外套恰克
      外套恰克卖出去啦...
      服装公司挣大钱啦...
      
  • 点击Java之23种设计模式查看更多的设计模式

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
桥接模式是一种结构型设计模式,它的主要目的是将抽象部分与实现部分分离,使它们能够独立地变化。下面是一个Java桥接模式的示例: 首先定义一个抽象类Shape,它有一个DrawAPI的成员变量,表示它的实现。 ```java public abstract class Shape { protected DrawAPI drawAPI; protected Shape(DrawAPI drawAPI) { this.drawAPI = drawAPI; } public abstract void draw(); } ``` 然后定义具体的形状类,比如Circle和Rectangle,它们继承自抽象类Shape,并实现了draw方法。 ```java public class Circle extends Shape { private int x, y, radius; public Circle(int x, int y, int radius, DrawAPI drawAPI) { super(drawAPI); this.x = x; this.y = y; this.radius = radius; } @Override public void draw() { drawAPI.drawCircle(radius, x, y); } } public class Rectangle extends Shape { private int x, y, width, height; public Rectangle(int x, int y, int width, int height, DrawAPI drawAPI) { super(drawAPI); this.x = x; this.y = y; this.width = width; this.height = height; } @Override public void draw() { drawAPI.drawRectangle(x, y, width, height); } } ``` 最后定义一个DrawAPI接口,它有两个方法drawCircle和drawRectangle,表示画圆和画矩形的实现。 ```java public interface DrawAPI { void drawCircle(int radius, int x, int y); void drawRectangle(int x, int y, int width, int height); } ``` 现在,我们可以使用不同的DrawAPI实现来创建不同的Shape对象,比如: ```java DrawAPI redDrawAPI = new RedDrawAPI(); Shape redCircle = new Circle(100, 100, 10, redDrawAPI); redCircle.draw(); DrawAPI greenDrawAPI = new GreenDrawAPI(); Shape greenRectangle = new Rectangle(50, 50, 100, 200, greenDrawAPI); greenRectangle.draw(); ``` 这样就可以将形状的抽象部分和实现部分分离了。如果需要增加一种新的形状或者实现,只需要创建一个新的类实现Shape或者DrawAPI接口即可,不需要修改原有的代码。 完整的代码示例可以参考以下链接:https://github.com/iluwatar/java-design-patterns/tree/master/bridge

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值