设计模式之桥接模式

桥接模式,也称桥梁模式,主要用意为抽象部分与实现部分相分离(脱耦),使它们可以各自独立的变换。桥接模式为结构型模式
那为什么要抽象实现相分离呢?什么时候用呢?使用它有什么好处呢?这里还是以毛笔、蜡笔、颜料为例。首先是我们的需求:画出一副尺寸较大的图画。我们知道,画一幅画,尤其是大尺寸的画,需要大号、中号、小号三种型号的笔,色彩也需要各种不同的颜色,这样才能画出色彩均匀、精致的图画。ok,需求有了,工具也有了。下面开始制定方案,因为我们有蜡笔和毛笔两种画笔,而没有要求必须使用什么画笔,所以我们很容易就制定出两种方案:
(1)用蜡笔:为了节省资源,我们使用最少的颜色,即RGB色彩模式,所以需要:大中小型号蜡笔、红绿蓝蜡笔,由于蜡笔的型号与颜色不能分离,所以我们需要3*3=9种不同的蜡笔。
(2)用毛笔,依然是三种型号与三种颜色,但由于毛笔的型号和颜料可以分离,所以我们只需要3+3=6种,之后将型号与颜色组合起来。

这里只用到了最少的颜色与型号,如果有36种颜色,12种型号的笔,那又是什么选择呢?我们需要36*12=432支不同的蜡笔,或者36种颜料+12支毛笔。而随着两种维度(型号与颜色)变换的加剧,甚至出现第三种维度,这样的优势就会愈来愈明显了。下面是上述方案的代码实现:
1.蜡笔抽象以及实现类
public abstract class Crayon {
    public abstract void print();
}
//大号红色蜡笔
public class RedBigCrayon extends Crayon {
    @Override
    public void print() {
        System.out.println("This is Red Big Crayon!");
    }
}
//小号红色蜡笔
public class RedSmallCrayon extends Crayon {
    @Override
    public void print() {
        System.out.println("This is Red Small Crayon!");
    }
}
2.颜料类
public class Color {
    protected  String color;
}
//红色颜料
public class Red extends Color{
    public Red(){
        this.color="Red";
    }
}
//绿色颜料
public class Green extends Color {
    public Green(){
        this.color="Green";
    }
}
//蓝色颜料
public class Blue extends Color {
    public Blue(){
        this.color="Blue";
    }
}
3.毛笔抽象及实现类
public abstract class Brush {
    protected Color c;
    public void setColor(Color color){
        this.c=color;
    }
    public abstract void paint();
}
//大号毛笔
public class BigBrush extends Brush {
    @Override
    public void paint() {
        System.out.println("使用大号"+this.c.color+"毛笔");
    }
}
//小号毛笔
public class SmallBrush extends Brush{
    @Override
    public void paint() {
        System.out.println("使用小号"+this.c.color+"毛笔");
    }
}
4.客户端-测试类
public class Test {
    public static void main(String[] args){
       //使用蜡笔,每种蜡笔都要单独创建,要创建九种
        Crayon crayon=new RedBigCrayon();
        Crayon crayon1=new RedSmallCrayon();
        //使用毛笔,只需创建三种颜料,三种毛笔
        Color red=new Red();
        Color green=new Green();
        Color blue=new Blue();
        Brush brush=new BigBrush();
        Brush brush1=new SmallBrush();
        brush.setColor(red);  //大号红色毛笔
        brush.setColor(green);//大号绿色毛笔
        brush.setColor(blue);//大号蓝色毛笔
        brush1.setColor(red); //小号红色毛笔
    }
}
桥接模式的使用场景:1.当系统构件需要将抽象化与具体化各自可以灵活的变化时,应避免使用静态关系。2.要求实现化角色的改变对客户端无影响或者对客户端完全透明。3.当构件有多于一个的抽象化角色和具体化角色时,系统需要他们之间动态耦合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值