桥接模式

桥接模式(Bridge pattern)
概念
就像一个桥,将两个变化维度连接起来,各个维度都可以独立的变化
前景

商场系统中常见的商品分类,如电脑,如何处理好商品分类的问题?我们可以采用下图的多层继承结构来实现


问题

扩展性问题(类个数膨胀

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类图


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值