桥接模式(Bridge pattern)
概念
就像一个桥,将两个变化维度连接起来,各个维度都可以独立的变化
前景
商场系统中常见的商品分类,如电脑,如何处理好商品分类的问题?我们可以采用下图的多层继承结构来实现
![](https://i-blog.csdnimg.cn/blog_migrate/12f41482602ec4886da5cab2290b629d.png)
问题
扩展性问题(类个数膨胀)
1:如果要增加一个新的电脑品牌类型,则要增加各个品牌下面的类
2:如果要增加一个新的品牌,也要增加各种电脑类型的类
违反单一原则
一个类存在两个可能导致变化的因素,如苹果笔记本,苹果品牌和电脑种类,两个因素共同影响了一个类
应用场景
1:JDBC驱动程序
2:AWT中的Peer架构
3:银行日志管理
(1)格式分类:操作日志、交易日志、异常日志
(2)距离分类:本地记录日志、异地记录日志
4:人力资源系统中的奖金计算模块
(1)奖金分类:个人奖金、团体奖金、激励奖金
(2)部门分类:人事部门、销售部门、研发部门
5:OA系统中的消息处理
(1)业务类型:普通消息、加急消息、特急消息
(2)发送方式:系统消息、手机短信、邮件
案例(电脑分类)
想一想,如果要构造
台式机--------联想台式机
--------苹果台式机
笔记本--------联想笔记本
--------苹果笔记本
平板 --------联想平板
--------苹果平板
原始方式(脑袋都大了!有木有!!)
/*
* 电脑接口
*/
public interface Computer {
public abstract void sale();
}
/*
* 电脑类型
*/
class Desktop implements Computer{
public void sale() {
System.out.println("销售台式机");
}
}
class Laptop implements Computer{
public void sale() {
System.out.println("销售笔记本");
}
}
class Pad implements Computer{
public void sale() {
System.out.println("销售平板电脑");
}
}
/*
* 具体品牌分类
*/
class LenovoDesktop extends Desktop{
public void sale() {
System.out.println("销售联想台式机");
}
}
class LenovoLaptop extends Laptop{
public void sale() {
System.out.println("销售联系笔记本");
}
}
class LenovoPad extends Pad{
public void sale() {
System.out.println("销售联想平板");
}
}
class AppleDesktop extends Desktop{
public void sale() {
System.out.println("销售苹果台式机");
}
}
class AppleLaptop extends Laptop{
public void sale() {
System.out.println("销售苹果笔记本");
}
}
class ApplePad extends Pad{
public void sale() {
System.out.println("销售苹果平板");
}
}
桥接模式(将品牌和电脑分类两个维度独立开,同时,又有一座桥连接两个独立的分类-------具体体现为在电脑分类中引用品牌接口)
品牌维度
/*
* 品牌维度
*/
public interface Brand {
public abstract void sale();
}
/*
* 具体品牌
*/
class Lenovo implements Brand{
public void sale() {
System.out.println("销售联想笔记本");
}
}
class Apple implements Brand{
public void sale() {
System.out.println("销售苹果笔记本");
}
}
电脑种类维度(这里对品牌的引用,就相当于Bridge桥)
/*
* 电脑种类维度
*/
public class ComputerClass {
private Brand brand;
public ComputerClass(Brand brand) {
super();
this.brand = brand;
}
public void sale(){
brand.sale();
}
}
/*
* 具体电脑种类
*/
//台式机
class DeskTops extends ComputerClass{
public DeskTops(Brand brand) {
super(brand);
}
public void sale(){
super.sale();
System.out.println("销售台式机");
}
}
//笔记本
class LapTops extends ComputerClass{
public LapTops(Brand brand) {
super(brand);
}
public void sale(){
super.sale();
System.out.println("销售笔记本");
}
}
//平板
class PadTop extends ComputerClass{
public PadTop(Brand brand) {
super(brand);
}
public void sale(){
super.sale();
System.out.println("销售平板");
}
}
客户端测试
public class Client {
public static void main(String[] args) {
//销售联想笔记本
ComputerClass c = new DeskTops(new Lenovo());
c.sale();
//销售苹果平板
ComputerClass c1 = new PadTop(new Apple());
c1.sale();
}
}
console:
销售联想笔记本
销售台式机
销售苹果笔记本
销售平板
UML类图