时间: 2020-09-18|46次围观|0 条评论

一、场景

商场系统中常见的商品分类,例如电脑。

二、实质

处理多重继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。

三、示例

1、没有使用桥接方式

设计模式学习笔记—桥接模式bridge(Java版)插图

package com.lgd.nobridge;

public interface ComputerNoBridge {
	void sale();
}

class Desktop implements ComputerNoBridge{

	@Override
	public void sale() {
		System.out.println("销售台式机");
	}
	
}

class Laptop implements ComputerNoBridge{

	@Override
	public void sale() {
		System.out.println("销售笔记本");
	}
	
}

class Pad implements ComputerNoBridge{

	@Override
	public void sale() {
		System.out.println("销售平板");		
	}
	
}

class LenovoDesktop extends Desktop{
	@Override
	public void sale() {
		System.out.println("销售联想台式机");		
	}
}

class LenovoLaptop extends Laptop{
	@Override
	public void sale() {
		System.out.println("销售联想笔记本");		
	}
}
class LenovoPad extends Pad{
	@Override
	public void sale() {
		System.out.println("销售联想平板");		
	}
}


class ShenzhouDesktop extends Desktop{
	@Override
	public void sale() {
		System.out.println("销售神舟台式机");		
	}
}

class ShenzhouLaptop extends Laptop{
	@Override
	public void sale() {
		System.out.println("销售神舟笔记本");		
	}
}
class ShenzhouPad extends Pad{
	@Override
	public void sale() {
		System.out.println("销售神舟平板");		
	}
}

class DellDesktop extends Desktop{
	@Override
	public void sale() {
		System.out.println("销售戴尔台式机");		
	}
}

class DellLaptop extends Laptop{
	@Override
	public void sale() {
		System.out.println("销售戴尔笔记本");		
	}
}
class DellPad extends Pad{
	@Override
	public void sale() {
		System.out.println("销售戴尔平板");		
	}
}

2、桥接方式

设计模式学习笔记—桥接模式bridge(Java版)插图1

package com.lgd.bridge;

/**
 * 品牌维度
 * @author liguodong
 *
 */
public interface Brand {
	void sale();
}

class Lenovo implements Brand
{

	@Override
	public void sale() {
		System.out.print("销售联想");
	}
	
}

class Dell implements Brand{

	@Override
	public void sale() {
		System.out.print("销售戴尔");
		
	}
	
}

class Shenzhou implements Brand{

	@Override
	public void sale() {
		System.out.print("销售神舟");
		
	}
	
}

package com.lgd.bridge;

/**
 * 电脑类型维度
 * @author liguodong
 *
 */
public class Computer {
	protected Brand brand;
	public Computer(Brand b)
	{
		this.brand = b;
	}
	public void sale(){
		brand.sale();
	}
}

class Desktop extends Computer{

	public Desktop(Brand b) {
		super(b);		
	}

	@Override
	public void sale() {
		// TODO Auto-generated method stub
		super.sale();
		System.out.println("--台式机");
	}	
}

class Laptop extends Computer{

	public Laptop(Brand b) {
		super(b);
		
	}

	@Override
	public void sale() {
		// TODO Auto-generated method stub
		super.sale();
		System.out.println("--笔记本");
	}	
}

package com.lgd.bridge;

public class Client {
	public static void main(String[] args) {
		//销售联想的笔记本
		Computer computer = new Laptop(new Lenovo());
		computer.sale();
		
		//销售神舟的台式机
		Computer computer2 = new Desktop(new Shenzhou());
		computer2.sale();
	}
}

运行结果:

销售联想--笔记本
销售神舟--台式机

四、总结

桥接模式可以取代多层继承(不是多重继承)的方案。多层继承违背了单一职责原则(一个类应该只有一个发生变化的原因),复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。

桥接模式极大地提高了系统的可扩展性,在两个变化维度中任意扩展一个维度都不需要修改原有的系统,符合开闭原则(对于模块扩展是开放的,对于原有代码的修改是关闭的)。

五、应用场景

JDBC驱动程序

银行日志管理

格式分类:操作日志,交易日志,异常日志

距离分离:本地记录日志,异地记录日志

人力资源系统中的奖金计算模块

奖金分类:个人奖金,团队奖金,激励奖金

部门分类:人事部,销售部,研发部

OA系统中的消息处理

业务类型:普通消息,加急消息,特急消息

发送消息方式:系统内消息,手机短信,邮件

原文链接:https://blog.csdn.net/scgaliguodong123_/article/details/44035795

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《设计模式学习笔记—桥接模式bridge(Java版)
   

还没有人抢沙发呢~