设计模式之桥接模式

1.什么是桥接模式

抽象部分与它的实现部分分离,使它们都可以独立地变化。(即常用于有两个变化维度的系统)

2.学习桥接模式

  • 用抽象关联取代了传统的多层继承
  • 将类之间的静态继承关系转换为动态的对象组合关系

3.桥接模式代码实现

img

代码基本结构

  • 抽象类
  • 扩充抽象类
  • 实现类接口
  • 具体实现类

实例分析

现需要提供大中小3种型号的画笔,能够绘制5种不同颜色,如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型号的毛笔,外加5个颜料盒,用3+5=8个类就可以实现15支蜡笔的功能。本实例使用桥接模式来模拟毛笔的使用过程。

实现类接口

public interface Color{    void bepaint(String penType,String name);}

具体实现类

public class Red implements Color{    public  void bepaint(String penType,String name){        System.out.println(penType+"红色的"+name+".");    }}
public class Green implements Color{    public  void bepaint(String penType,String name){        System.out.println(penType+"红色的"+name+".");    }}
public class Blue implements Color{    public  void bepaint(String penType,String name){        System.out.println(penType+"红色的"+name+".");    }}
public class White implements Color{    public  void bepaint(String penType,String name){        System.out.println(penType+"红色的"+name+".");    }}
public class Black implements Color{    public  void bepaint(String penType,String name){        System.out.println(penType+"红色的"+name+".");    }}

抽象类

1.为什么这里是抽象类?

因为可以和别人建立关联,如果使用接口则不能实现!

2.为什么使用protected?

被 protected 修饰的成员对于本包和其子类可见。(在子类当中使用!!)

public abstract class Pen{    //1.建立关联    protected Color color;    //2.set注入    public void setColor(Color color){        this.color=color;    }    //抽象方法    public abstract void draw(String name);}

扩充抽象类

public class BigPen extends Pen{    public void draw(String name){        String penType="大号毛笔";        this.color.bepaint(penType,name);    }}
public class MiddlePen extends Pen{    public void draw(String name){        String penType="中号毛笔";        this.color.bepaint(penType,name);    }}
public class SmallPen extends Pen{    public void draw(String name){        String penType="小号毛笔";        this.color.bepaint(penType,name);    }}

练习题目

考虑一个自动茶水销售机的例子,该机器销售的茶水价格与两个维度:杯子大小与茶叶品种有关。

杯子的体积上暂时分为小杯,大杯(大杯价格是小杯2倍);

在茶叶品种上,分为红茶(4元一小杯)和绿茶(3元一小杯)。

实现类接口

public intrface Tea{    float price();}

具体实现类

public class RedTea implements Tea{    public float price(){        return 4.0f;    }}
public class GreenTea implements Tea{    public float price(){        return 3.0f;    }}

抽象类

public abstract class TeaSize{    protected Tea tea;    public void setTea(Tea tea){        this.tea=tea;    }    public abstract float price();}

扩充抽象类

public class BigSize extends TeaSize{    public float price(){        return this.tea.price()*2;    }}
public class SmallSize extends TeaSize{    public float price(){        return this.tea.price();    }}

如果未来需要增加中杯(小杯价格的1.5倍),如何实现?

在扩充抽象类中加MiddleSize类!

如果未来需要增加黑茶(5元1小杯),如何实现?

在具体实现类中添加BlackTea!

结论:在两个维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则

4.桥接模式的适用环境

  • 需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系
  • 抽象部分和实现部分可以以继承的方式独立扩展而互不影响
  • 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立地进行扩展
  • 不希望使用继承或因为多层继承导致系统
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值