一、场景
商场系统中常见的商品分类,例如电脑。
二、实质
处理多重继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。
三、示例
1、没有使用桥接方式
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、桥接方式
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
本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。
还没有人抢沙发呢~