设计模式 结构型设计模式之桥梁模式

    xiaoxiao2025-10-16  3

    1 基础知识

    1.1 标准定义

    桥梁模式标准定义:将抽象部分与它的实现部分分离,使它们都可以独立的变化。

    1.2 分析和说明

    桥梁模式属于结构型设计模式。它将抽象化与实现化脱藕,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。

    Bridge角色包括抽象化(Abstraction)角色、修正抽象化(Refine Abstraction)角色、实现化(Implementor)角色和具体实现化(Concrete Implementor)角色。

    抽象化(Abstraction)角色:Abstraction定义抽象类的接口,维护一个指向Implementor类型对象的指针。抽象化(Abstraction)角色可以是接口,也可以是抽象类。属于不可缺少角色。

    修正抽象化(Refine Abstraction)角色:RefinedAbstraction扩充由Abstraction定义的接口, Implementor定义实现类的接口。该接口不一定要与Abstract的接口完全一致。

    实现化(Implementor)角色:Implementor接口仅提供基本操作。这个抽象类规范具体实现化角色,规定出具体实现化角色当有的方法和属性。实现化角色可以是接口,也可以是抽象类,属于不可缺少角色。

    具体实现化(Concrete Implementor)角色:Concreteimplementor实现Implementor接口并定义它的具体实现。

    2 应用场景举例

    比如公司有几个技术部门,分别是研发部、开发部和售后服务部。这些部门都有培训和开会等工作。培训的时候,要有培训老师、培训教材、培训人员和培训教室。对开会也是一样的,有开会的支持人、开会地点等。所以,可以把部门理解为抽象单位,研发部、开发部和售后服务部继承抽象单位并实现具体的工作。日常工作可以抽象起来,培训和开会继承日常工作,不同的部门日常工作是不同的。

    可以把AbstractDepartment类理解为抽象化角色,AbstractAction类是实现化角色。DevelopmentDep类、FinanceDep类和MarketDep类理解为修正抽象化角色。Meeting类和Training类理解为具体实现化角色。其结构类图如下图:

    桥梁模式实现的顺序:(1)创建一个活动对象 (2)创建一个部门对象 (3)把活动对象赋值给部门对象 (4)显示部门对象的活动情况

    活动对象可以分为会议对象和培训对象,部门对象可以是技术部门对象、财务部门对象和市场部门对象,所以两个类型可以自己内部转化,只是通过他们的抽象类或接口实现了扩展和复用。即技术部门对象可以实现会议对象和培训对象的工作。财务部门对象和市场部门对象也可以实现会议对象和培训对象的工作。使得活动和部门二者可以独立的转化。

    3 Java的实现程序代码

    Java程序实现主要包括AbstractAction抽象类文件、AbstractDepartment抽象类文件、DevelopmentDep类 文件、FinanceDep类文件、MarketDep类文件、Meeting类文件和Training类文件等6个文件。

    AbstractAction抽象类是实现化角色。其类程序代码为:

    public abstract class AbstractAction { public void doAction(String depart, String title){ if(depart.length()==0){ System.out.println("这是部门的标准工作活动"); } System.out.println("这是"+depart+"部门的 标准工作活动,"+"主题是"+title); } }

    AbstractDepartment抽象类理解为抽象化角色,其程序代码为:

    public abstract class AbstractDepartment { protected AbstractAction departAction; public void setAbstractAction(AbstractAction action){ departAction = action; } public void action(String title){ departAction.doAction("", title); } }

    DevelopmentDep类、FinanceDep类和MarketDep类的程序为:

    public class DevelopmentDep extends AbstractDepartment{ private String departName = "开发部"; public void action(String title){ departAction.doAction(departName, title); } }

    public class FinanceDep extends AbstractDepartment{ private String departName = "财务部"; public  void action(String title){ departAction.doAction(departName, title); } }

    public class MarketDep extends AbstractDepartment { public String departName= "市场部"; public void action(String title){ departAction.doAction(departName, title); } }

    Meeting 和Training类文件程序代码为:

    public class Meeting extends AbstractAction{ public void doAction(String depart, String title){ if(depart.length()==0){ System.out.println("这是部门的会议工作活动"); } System.out.println("这是"+depart+"会议工作活动,"+"主题是"+title); } }

    public class Training extends AbstractAction{ public void doAction(String depart, String title){ if(depart.length()==0){ System.out.println("这是部门的培训工作活动"); } System.out.println("这是"+depart+"培训工作活动,"+"主题是"+title); } }

    桥梁模式测试程序代码为:

    public class Client { public static void scene1(){ AbstractAction action = new Training(); AbstractDepartment depart = new DevelopmentDep(); depart.setAbstractAction(action); depart.action("提高开发技能"); } public static void scene2(){ AbstractAction action = new Meeting(); AbstractDepartment depart = new FinanceDep(); depart.setAbstractAction(action); depart.action("检查会计制度"); } public static void scene3(){ AbstractAction action = new Training(); AbstractDepartment depart = new MarketDep(); depart.setAbstractAction(action); depart.action("沟通技巧"); } public static void main(String[] args){ scene1(); scene2(); scene3(); } }

    转载请注明原文地址: https://ju.6miu.com/read-1303228.html
    最新回复(0)