java计划模式-桥接模式

打印 上一主题 下一主题

主题 552|帖子 552|积分 1656

一. 概述

        桥接模式(Bridge Pattern)是一种结构型计划模式,用于将抽象部门与实在现部门分离,使它们可以独立地变化。桥接模式重要目的是解决当一个类存在多个继续品级时,由于继续带来的耦合问题,以及扩展性不足的问题。


  • 界说:将抽象部门与他的具体实现部门分离,使它们都可以独立的变化,通过组合的方式建立两个类之间的联系,而不是继续
  • 范例:结构性。
二. 使用场景


  • 抽象和具体实现之间增长更多的灵活性
  • 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都须要独立进行扩展
  • 不盼望使用继续,或因为多层继续导致系统类的个数剧增
 三. 桥接模式的原理及代码示例

1. 桥接模式的构成部门:


  • 抽象化(Abstraction)角色 :重要负责界说出该角色的行为 ,并包含一个对实现化对象的引用。
  • 扩展抽象化(RefinedAbstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  • 实现化(Implementor)角色 :界说实现化角色的接口,包含角色必须的行为和属性,并供扩展抽象化角色调用。
  • 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。
2. UML图


3. 桥接模式具体实现步骤:


  • 界说实手机接口
  • 实现手机接口(不同的品牌添加不同的实现类)
  • 界说抽象类(通过这个抽象类实现抽象和具体实现分离)
  • 实现抽象类。
  • 在扩展抽象化角色中,组合实现化角色的实例,并实现具体的行为。
4. 示例代码

        代码示例以手机和产地为例,手机分为国产品牌和美国品牌,国产手机可分为华为,vivo等,美国有苹果手机,谷歌手机等,对国产手机的添加只需添加一个具体实现类即可,如果想要添加一个韩国的手机则须要对抽象类进行继续实现。


  • 1. 界说接口
  1. package com.seata;
  2. /**
  3. * 文件名:dnm
  4. * 创建者:
  5. * 创建时间:
  6. * 描述:手机品牌接口
  7. */
  8. public interface IMobilePhoneInterface {
  9.     void showMobilePhone();
  10. }
复制代码


  • 2. 实现类(华为手机)
  1. package com.seata;
  2. /**
  3. * 文件名:HuaWeiMobilePhone
  4. * 创建者:
  5. * 创建时间:
  6. * 描述:华为品牌手机
  7. */
  8. public class HuaWeiMobilePhone implements IMobilePhoneInterface{
  9.     @Override
  10.     public void showMobilePhone() {
  11.         System.out.println("华为手机");
  12.     }
  13. }
复制代码


  • 3. 实现类(苹果手机)
  1. package com.seata;
  2. /**
  3. * 文件名:AmericaMobilePhone
  4. * 创建者:
  5. * 创建时间:
  6. * 描述:苹果手机
  7. */
  8. public class AppleMobilePhone implements IMobilePhoneInterface{
  9.     @Override
  10.     public void showMobilePhone() {
  11.         System.out.println("苹果手机");
  12.     }
  13. }
复制代码


  • 4. 界说抽象类
  1. package com.seata;
  2. /**
  3. * 文件名:CountryAbstract
  4. * 创建者:
  5. * 创建时间:
  6. * 描述:抽象类
  7. */
  8. public abstract class CountryAbstract {
  9.     // 持有接口属性
  10.     protected IMobilePhoneInterface phoneInterface;
  11.     public CountryAbstract(IMobilePhoneInterface phoneInterface){
  12.         this.phoneInterface = phoneInterface;
  13.     }
  14.     abstract void showCountry();
  15. }
复制代码


  • 5. 国产品牌
  1. package com.seata;
  2. /**
  3. * 文件名:China
  4. * 创建者:
  5. * 创建时间:
  6. * 描述:国产品牌
  7. */
  8. public class China extends CountryAbstract{
  9.     public China(IMobilePhoneInterface phoneInterface){
  10.         super(phoneInterface);
  11.     }
  12.     @Override
  13.     void showCountry() {
  14.         phoneInterface.showMobilePhone();
  15.         System.out.println("国产品牌");
  16.     }
  17. }
复制代码


  • 6. 美国品牌
  1. package com.seata;
  2. /**
  3. * 文件名:America
  4. * 创建者:
  5. * 创建时间:
  6. * 描述:美国品牌
  7. */
  8. public class America extends CountryAbstract{
  9.     public America(IMobilePhoneInterface phoneInterface){
  10.         super(phoneInterface);
  11.     }
  12.     @Override
  13.     void showCountry() {
  14.         phoneInterface.showMobilePhone();
  15.         System.out.println("美国品牌");
  16.     }
  17. }
复制代码


  • 7. 测试类
  1. package com.seata;
  2. /**
  3. * 文件名:Test
  4. * 创建者:
  5. * 创建时间:
  6. * 描述:  测试类
  7. */
  8. public class Test {
  9.     public static void main(String[] args) {
  10.         //国产品牌
  11.         China countryAbstract = new China(new HuaWeiMobilePhone());
  12.         countryAbstract.showCountry();
  13.         System.out.println("=======================================");
  14.         //美国品牌
  15.         America anAbstract = new America(new AppleMobilePhone());
  16.         anAbstract.showCountry();
  17.     }
  18. }
复制代码
 测试效果



  • 8. 如果我们想要添加一个国产 vivo 手机,只须要在添加一个实现类即可
  1. package com.seata;
  2. /**
  3. * 文件名:VivoMobilePhone
  4. * 创建者:
  5. * 创建时间:
  6. * 描述:vivo手机
  7. */
  8. public class VivoMobilePhone implements IMobilePhoneInterface{
  9.     @Override
  10.     public void showMobilePhone() {
  11.         System.out.println("vivo 手机");
  12.     }
  13. }
复制代码
测试类添加
  1. package com.seata;
  2. /**
  3. * 文件名:Test
  4. * 创建者:
  5. * 创建时间:
  6. * 描述:  测试类
  7. */
  8. public class Test {
  9.     public static void main(String[] args) {
  10.         //国产品牌
  11.         China countryAbstract = new China(new HuaWeiMobilePhone());
  12.         countryAbstract.showCountry();
  13.         System.out.println("=======================================");
  14.         //美国品牌
  15.         America anAbstract = new America(new AppleMobilePhone());
  16.         anAbstract.showCountry();
  17.         System.out.println("=======================================");
  18.         //Vivo品牌
  19.         China china = new China(new VivoMobilePhone());
  20.         china.showCountry();
  21.     }
  22. }
复制代码
测试效果



  • 9.如果我们想要添加一个韩国的三星品牌手机,这个时候须要添加抽象类的实现类,再添加一个具体实现类
添加抽象类的实现类
  1. package com.seata;
  2. /**
  3. * 文件名:BnagZiMobilePhone
  4. * 创建者:
  5. * 创建时间:
  6. * 描述:韩国
  7. */
  8. public class BnagZi extends CountryAbstract{
  9.     public BnagZi(IMobilePhoneInterface phoneInterface){
  10.         super(phoneInterface);
  11.     }
  12.     @Override
  13.     void showCountry() {
  14.         phoneInterface.showMobilePhone();
  15.         System.out.println("韩国品牌");
  16.     }
  17. }
复制代码
添加手机品牌具体实现类
  1. package com.seata;
  2. /**
  3. * 文件名:BnagZiMobilePhone
  4. * 创建者:
  5. * 创建时间:
  6. * 描述:三星手机
  7. */
  8. public class SanXingMobilePhone implements IMobilePhoneInterface{
  9.     @Override
  10.     public void showMobilePhone() {
  11.         System.out.println("三星手机");
  12.     }
  13. }
复制代码
测试类
  1. package com.seata;
  2. /**
  3. * 文件名:Test
  4. * 创建者:
  5. * 创建时间:
  6. * 描述:  测试类
  7. */
  8. public class Test {
  9.     public static void main(String[] args) {
  10.         //国产品牌
  11.         China countryAbstract = new China(new HuaWeiMobilePhone());
  12.         countryAbstract.showCountry();
  13.         System.out.println("=======================================");
  14.         //美国品牌
  15.         America anAbstract = new America(new AppleMobilePhone());
  16.         anAbstract.showCountry();
  17.         System.out.println("=======================================");
  18.         //Vivo品牌
  19.         China china = new China(new VivoMobilePhone());
  20.         china.showCountry();
  21.         System.out.println("=======================================");
  22.         //三星品牌
  23.         BnagZi bnagZi = new BnagZi(new SanXingMobilePhone());
  24.         bnagZi.showCountry();
  25.     }
  26. }
复制代码
测试效果

四. 桥接模式的优缺点

优点:


  • 分离抽象部门及其具体实现部门,解耦抽象与实现的绑定关系
  • 进步了系统的可扩展性
  • 符合开闭原则
  • 符合合成复用原则
缺点:


  • 增长了系统的理解与计划难度
  • 须要正确的识别出系统中两个独立变化的维度

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊雷无声

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表