版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40646143/article/details/85142005
我们可以用多重继承结构实现下图的关系
这样存在一个问题:
- 如果要增加一个新的电脑类型, 智能手机 ,则要增加各个品牌下面的类 。
- 如果要增加一个新的品牌 , 也要增加各种电脑类型的类 。
- 违反单一职责原则 -- 一个类:联想笔记本 ,有俩个引起这个类变化的原因。
我们使用多重继承来实现上图:
package com.tuogo.bridge;
/**电脑类
* @author 晓电脑
*/
public interface Computer {
/**
* 销售
*/
void sale();
}
//销售台式机
class DesktopComputer implements Computer{
@Override
public void sale() {
System.out.println("销售台式机");
}
}
//销售联想台式机
class LenovoComputer extends DesktopComputer{
@Override
public void sale() {
System.out.println("销售联想台式机");
}
}
//销售戴尔台式机
class DellComputer extends DesktopComputer{
@Override
public void sale() {
System.out.println("销售戴尔台式机");
}
}
//销售神州台式机
class ShenzhouComputer extends DesktopComputer{
@Override
public void sale() {
System.out.println("销售神州台式机");
}
}
//销售笔记本
class NotebookComputer implements Computer{
@Override
public void sale() {
System.out.println("销售笔记本");
}
}
//销售联想笔记本
class LenovoNotebookComputer extends NotebookComputer{
@Override
public void sale() {
System.out.println("销售联想笔记本");
}
}
//销售戴尔笔记本
class DellNotebookComputer extends NotebookComputer{
@Override
public void sale() {
System.out.println("销售戴尔笔记本");
}
}
//销售神州笔记本
class ShenzhouNotebookComputer extends NotebookComputer{
@Override
public void sale() {
System.out.println("销售神州笔记本");
}
}
//销售平板
class Flat implements Computer{
@Override
public void sale() {
System.out.println("销售平板");
}
}
//销售联想平板
class LenovoFlat extends Flat{
@Override
public void sale() {
System.out.println("销售联想平板");
}
}
//销售戴尔平板
class DellFlat extends Flat{
@Override
public void sale() {
System.out.println("销售戴尔平板");
}
}
//销售神州平板
class ShenzhouFlat extends Flat{
@Override
public void sale() {
System.out.println("销售神州平板");
}
}
绘制出uml图,如下
使用多重继承就暴露出一个问题
- 当你有新的电脑类型如华为电脑,你这时需要在台式机/笔记本/平板 下面都要添加华为这个类型的电脑,在后期维护上,不易维护,而且使类快速膨胀 解决办法使用桥接模式
我们使用桥接模式bridge
1), 创建品牌接口和实现类
package com.tuogo.bridge;
/**品牌类接口
* @author 晓电脑
*/
public interface Brand {
void saleBrand();
}
//联想品牌
class LenovoBrand implements Brand{
@Override
public void saleBrand() {
System.out.println("联想品牌");
}
}
//戴尔品牌
class DellBrand implements Brand{
@Override
public void saleBrand() {
System.out.println("戴尔品牌");
}
}
//神州品牌
class ShenZhou implements Brand{
@Override
public void saleBrand() {
System.out.println("神州品牌");
}
}
2),创建桥接类 SaleComputer 类
/**销售电脑类型 分为台式机/笔记本/平板
* @author 晓电脑
*/
public class SaleComputer {
protected Brand brand;
public SaleComputer(Brand brand) {
this.brand = brand;
}
/**
* 销售电脑
*/
void saleComputer(){
brand.saleBrand();
}
}
//台式机电脑
class DesktopTypeComputer extends SaleComputer{
public DesktopTypeComputer(Brand brand) {
super(brand);
}
@Override
void saleComputer() {
super.saleComputer();
System.out.println("销售台式机");
}
}
//笔记本电脑
class NotebookTypeComputer extends SaleComputer{
public NotebookTypeComputer(Brand brand) {
super(brand);
}
@Override
void saleComputer() {
super.saleComputer();
System.out.println("销售笔记本");
}
}
//平板电脑
class FlatTypeComputer extends SaleComputer{
public FlatTypeComputer(Brand brand) {
super(brand);
}
@Override
void saleComputer() {
super.saleComputer();
System.out.println("销售平板");
}
}
3),创建测试客户端 Client
public class Client {
public static void main (String[] args) {
//销售台式机 联想电脑 直接new 出来
SaleComputer computer = new DesktopTypeComputer(new LenovoBrand());
computer.saleComputer();
//销售笔记本 电脑
NotebookTypeComputer computer1 = new NotebookTypeComputer(new LenovoBrand());
computer1.saleComputer();
//这样 电脑的类别 与 电脑品牌 是俩个维度 不管你是增加电脑类别 还是增加电脑品牌 都不需要做那些重复的操作
}
}
桥接模式的思路大致是这样的
- 把电脑类型分为一个维度,把品牌分为一个维度 这样你更改一个维度另一个维度不会发生变化
- 桥接模式核心是: 处理多层继承结构 , 处理多维度变化的场景 , 将各个维度设计成独立的继承结构 ,使各个维度可以独立的扩展在抽象层建立关联
桥接模式在实际开发中应用场景:
- 银行日志管理
- 1)格式分类 : 操作日志 , 交易日志 , 异常日志
- 2)距离分类 : 本地记录日志 , 异地记录日志
- 人力资源系统中的奖金计算模块
- 1),奖金分类 : 个人奖金 , 团体奖金 , 激励奖金
- 2),部门分类 : 人事部门 , 销售部门 , 研发部门
- OA系统中的消息处理
- 1), 业务类型 : 普通消息 , 加急消息 , 特急消息
- 2),发送消息类型 : 站内信 , 短信 , 邮箱