java设计模式之桥接模式

本文介绍了一种软件设计模式——桥接模式,通过实例讲解如何将抽象部分与其实现部分分离,使得二者能够独立变化。文章详细说明了桥接模式的设计过程,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.应用场景

   举个例子,铅笔和钢笔,都可以用来写字和画画。邮局可以邮寄信件和包裹,两者都有平邮和挂号邮寄两种功能。明白使用场景后,我们可以提取主要元素:事物和功能。

可以这样定义:有一类事务的集合,{A1,A2,A3...},每个事物都具有功能F1,F2,F3。当然会有个功能的集合{F1,F2,F3...}。在计算机的世界里我们如何表示呢,代码如下:

public class 信件{

    public void 平邮(){}

    public void 挂号(){}

}   

public class 包裹{

    public void 平邮(){}

    public void 挂号(){}

}   

每个事物是一个类,有m个事物,就有m个类,每个类有n个功能,一共下来有m*n个功能。显然,这种方法是不可取的。

2.桥接模式概念

   桥接模式是关于怎么将抽象部分和它的实现部分分离,使它们都可以独立变化。像之前那种写法,会有大量的重复的代码。

3.解决办法

  利用语义(所以语文学好是关键 呐),对于平邮和挂号,它们是邮局发送的两种方式,所以一句话:邮局有发送功能,我们就可以先得到一个接口,代码如下:

package qj_1;


public interface iPost {//邮局
        public void send();//发送功能
}

有了这个接口后,我们当然想着的是它的实现类了。

//平邮实现类

package qj_1;

public class Pmail implements iPost{
@Override
public void send() {
System.out.println("平邮发送。。");
}
}

//挂号实现类

package qj_1;

public class Gmail implements iPost{
@Override
public void send() {
System.out.println("挂号发送。。");
}
}

以上我们解决了问题的一半:邮局有平邮和挂号两种功能。信件和包裹,是两种不同的事物,它们有相同的功能,当然也有不同的。对于它们共同的部分我们可以将其封装到一个类中,但是该类又不能代替一个具体的事物,所以我们可以将其定义为抽象类。

package qj_1;

public abstract class AbstractThing {// 抽象类
private iPost post;// 多态成员

public AbstractThing(iPost obj) {
post = obj;
}

public void post() {// 平邮和挂号两种功能
post.send();
}
}

该抽象类是桥接模式的核心。重点是在该类中定义了多态成员,发送的两种方式是信件和包裹共享的功能。接下的就很明确了,信件和包裹两个具体的事物去继承抽象类。

package qj_1;
//信件实现类
public class Letter extends AbstractThing{
public Letter(iPost obj) {
super(obj);
}
//其他独有的变量和方法
}

package qj_1;
//包裹实现类
public class Parcel extends AbstractThing{


public Parcel(iPost obj) {
super(obj);
}
    //其他独有的变量和方法
}

测试类代码如下:

package qj_1;

public class Test {
public static void main(String[] str) {
iPost post = new Gmail();

Letter letter = new Letter(post);
letter.post();
}
}

4.分析总结

        从测试类中我们可以看出,先功能类中选择一种发送方式,然后再在事物类中选择一种具体的事物类,然后完成发送任务。所以可以总结,桥接模式完成的是一个多条件选择问题,假设有二维条件,分别有N1,N2个选择,桥接模式就是要求在一维的条件中选一个条件,再在二维的条件中选一个,完成有效的组合。这种情景在生活中很常见,比如,10件上衣10件裤子,你想搭配出一套衣服,你肯定会上衣摆出一排,在其中选一件,裤子摆出一排,在其中选一件。而不是衣服裤子混在一起挑。你从家里到长春,必须经过中转站北京,从家到北京好多路线和方式,从北京到长春同样很多路线,你肯定从家到北京的路线先选择一条,从北京到长春的路线选一条,完成从家到北京这个事。

  当需求发生变化时,桥接模式是如何满足的呢?

  当添加了新的事物,从抽象类中派生一个类即可。

package qj_1;
public class NewThing extends AbstractThing{
public NewThing(iPost obj) {
super(obj);
}
//其他独有的变量和方法
}

  当添加了新的发送方式,从接口派生出一个类即可。

package qj_1;
public class NewMail implements iPost{
@Override
public void send() {
System.out.println("新增的一种发送方式");
}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值