组合模式(Bridge Pattern) – 设计模式之结构型模式:

目录

组合模式(Component Pattern)

类图

例子1:

过程:

类图:

代码:

抽象组件:PlayerComposite

球员:BasketPlayer

球队: PlayerComposite

联盟: BasketLeager

测试

球员测试:

结果:

球队测试:

结果:

总结:


组合模式(Component Pattern)

定义: Compose objects into tree structures to represent part-whole hierarchies. Composit clients treat individual objects and compositions of objects uniformly.

将对象组合成树形结构以表示‘部分整体’的层次结构。 组合模式使得用户对单个对象和组合对象的使用具有一致性。

当需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式。

类图

组合模式通用的类图

抽象构件 Component 它是组合模式的精髓, 定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性

常见的组合内容:

    字符  单词  句子 段落  文章

    水滴  水流  小溪  江河  大海

    员工  部门  公司

例子1:

过程:

类图:

代码:

抽象组件:PlayerComposite

public abstract class PlayerComposite {public abstract void add(PlayerComposite player);public abstract  void remove(PlayerComposite player);public abstract void display();
}

球员:BasketPlayer

public class BasketPlayer extends PlayerComposite {private String name;private String role;private int age;public BasketPlayer(String name, String role,int age) {this.name = name;this.role = role;this.age = age;}@Overridepublic String toString() {return "{" +"name='" + name + '\'' +", role='" + role + '\'' +", age=" + age +'}';}@Overridepublic void add(PlayerComposite player) {//}@Overridepublic void remove(PlayerComposite player) {//}@Overridepublic void display() {//}
}

球队: PlayerComposite

public class BasketTeams extends PlayerComposite {private String name;private String position;private List<PlayerComposite> basketPlayers;public BasketTeams(String name, String position,List<PlayerComposite> basketPlayers) {this.name = name;this.position = position;this.basketPlayers = basketPlayers;}public BasketTeams(BasketPlayer... basketPlayers) {for (BasketPlayer basketPlayer : basketPlayers) {this.add(basketPlayer);}}@Overridepublic void add(PlayerComposite player) {this.basketPlayers.add(player);}@Overridepublic void remove(PlayerComposite player) {this.basketPlayers.remove(player);}@Overridepublic void display() {System.out.println("球队: "+name+" 位于:"+position +" 队伍里面有:");basketPlayers.forEach(e -> System.out.println(e.toString()));}}

联盟: BasketLeager

public class BasketLeager extends PlayerComposite {private String name;private List<PlayerComposite> basketTeams;public BasketLeager(String name, List<PlayerComposite> basketTeams) {this.name = name;this.basketTeams = basketTeams;}@Overridepublic void add(PlayerComposite player) {this.basketTeams.add(player);}@Overridepublic void remove(PlayerComposite player) {this.basketTeams.remove(player);}@Overridepublic void display() {System.out.println("篮球联盟: "+name+" 球队有 ");basketTeams.forEach(PlayerComposite::display);}}

测试

球员测试:

public class PlayerTest {public static void main(String[] args) {PlayerComposite  brown = new BasketPlayer("Brown","Small Forward",23);PlayerComposite  tatum =  new BasketPlayer("Tatum","Power Forward",22);PlayerComposite  walk = new BasketPlayer("Walk","Point Guard",29);PlayerComposite  mike = new BasketPlayer("Mike","Point Guard",35);List<PlayerComposite> basketPlayers = Lists.newArrayList(brown,tatum,walk,mike);PlayerComposite cellticTeam = new BasketTeams("凯尔特人", "东部",basketPlayers);cellticTeam.display();// 转会来的球员PlayerComposite aoJielie = new BasketPlayer("AoJielie", "Center", 22);cellticTeam.add(aoJielie);// 转会走的球员cellticTeam.remove(mike);System.out.println("====== change ===========");cellticTeam.display();}
}

结果:

球队: 凯尔特人 位于:东部 队伍里面有:{name='Brown', role='Small Forward', age=23}{name='Tatum', role='Power Forward', age=22}{name='Walk', role='Point Guard', age=29}{name='Mike', role='Point Guard', age=35}====== 交易后球队情况 ===========球队: 凯尔特人 位于:东部 队伍里面有:{name='Brown', role='Small Forward', age=23}{name='Tatum', role='Power Forward', age=22}{name='Walk', role='Point Guard', age=29}{name='AoJielie', role='Center', age=22}

球队测试:

public class TeamTest {public static void main(String[] args) {PlayerComposite  celtics = initTeamCel();PlayerComposite  laker =  initTeamLaker();List<PlayerComposite> basketTeams = Lists.newArrayList(celtics, laker);PlayerComposite basketLeager = new BasketLeager("NBA 联盟", basketTeams);basketLeager.display();//  新增加的球队PlayerComposite warrior = initTeamWarri();basketLeager.add(warrior);// 从联盟退出的球队basketLeager.remove(celtics);System.out.println("====== change ===========");basketLeager.display();}public static PlayerComposite initTeamCel(){PlayerComposite  brown = new BasketPlayer("Brown","Small Forward",23);PlayerComposite  tatum =  new BasketPlayer("Tatum","Power Forward",22);PlayerComposite  walk = new BasketPlayer("Walk","Point Guard",29);PlayerComposite  mike = new BasketPlayer("Mike","Point Guard",35);List<PlayerComposite> basketPlayers = Lists.newArrayList(brown,tatum,walk,mike);return new BasketTeams("凯尔特人", "东部",basketPlayers);}public static PlayerComposite initTeamLaker(){PlayerComposite  james =  new BasketPlayer("詹姆斯","小前锋",37);PlayerComposite  shat = new BasketPlayer("浓眉","大前锋",28);PlayerComposite  pork = new BasketPlayer("加索尔","中锋",32);List<PlayerComposite> basketPlayers = Lists.newArrayList(james,shat,pork);return new BasketTeams("湖人队", "西部",basketPlayers);}public static PlayerComposite initTeamWarri(){PlayerComposite  cury =  new BasketPlayer("库里","控球后卫",31);PlayerComposite  green = new BasketPlayer("格林","大前锋",28);PlayerComposite  tom = new BasketPlayer("汤普森","得分后卫",32);List<PlayerComposite> basketPlayers = Lists.newArrayList(cury,green,tom);return new BasketTeams("勇士队", "西部",basketPlayers);}
}

结果:

篮球联盟: NBA 联盟 球队有球队: 凯尔特人 位于:东部 队伍里面有:{name='Brown', role='Small Forward', age=23}{name='Tatum', role='Power Forward', age=22}{name='Walk', role='Point Guard', age=29}{name='Mike', role='Point Guard', age=35}球队: 湖人队 位于:西部 队伍里面有:{name='詹姆斯', role='小前锋', age=37}{name='浓眉', role='大前锋', age=28}{name='加索尔', role='中锋', age=32}====== change ===========篮球联盟: NBA 联盟 球队有球队: 湖人队 位于:西部 队伍里面有:{name='詹姆斯', role='小前锋', age=37}{name='浓眉', role='大前锋', age=28}{name='加索尔', role='中锋', age=32}球队: 勇士队 位于:西部 队伍里面有:{name='库里', role='控球后卫', age=31}{name='格林', role='大前锋', age=28}{name='汤普森', role='得分后卫', age=32}

总结:                                 

优点:

1、高层模块调用简单。

2、节点自由增加和删除。

缺点:

在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

使用场景:部分--整体场景,如树形菜单,文件、文件夹的管理,员工、部门

除去对节点的操作,组合模式的类图像不像模板模式? 尤其是抽象组件 是模板方法里面的抽象方法(Abstract Method),加具体方法就是一个模板方法了。

组合模式(Bridge Pattern) – 设计模式之结构型模式相关推荐

  1. 设计模式:结构型模式-桥接、外观、组合、享元模式

    结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦 ...

  2. 设计模式之结构型模式

    结构型模式 一.适配器模式 (一)定义:适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁,它结合了两个独立接口的功能.这种模式涉及到一个单一的类,该类负责加入独立的或不兼容 ...

  3. 设计模式05——结构型模式

    一.概述  结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象.由于组合关系或聚合关系比继承关系耦合 ...

  4. 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  5. 设计模式 之 结构型模式

    设计模式 之 结构型模式 模式 & 描述 包括 结构型模式 这些设计模式关注类和对象的组合.继承的概念被用来组合接口和定义组合对象获得新功能的方式. 适配器模式(Adapter Pattern ...

  6. 设计模式之结构型模式(5种)

    目录 结构型模式(Structural Pattern):怎么构造一个对象(行为.属性) 一.适配器模式 二.桥接模式(Bridge) 三.装饰者模式 设计模式在JAVA I/O库中的应用 案例 使用 ...

  7. 设计模式3——结构型模式

    结构型模式描述如何将类或对象按某种布局组成更大的结构,它分为类结构型和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足&q ...

  8. Java最全的设计模式之结构型模式

    这篇接着上篇,结构型模式包含了七种,没有看过上篇的可以点击超链接 Java设计模式之创建型模式 Java设计模式之创建型模式 9.适配器模式 9.1结构型模式 9.2适配器模式的定义 9.3适配器模式 ...

  9. 设计模式_结构型模式学习

    其中,单例模式用来创建全局唯一的对象.工厂模式用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象.建造者模式是用来创建复杂对象,可以通过设置不同的可 ...

最新文章

  1. Delphi之对象库(Object Repository)
  2. 距离和相似性度量方法
  3. MySQL主从原理,基于快速学习一门技术的3种方式!
  4. 微信小程序-封装http请求(ajax)
  5. PostgreSQL流复制之二:pgpool-II实现PostgreSQL数据库集群(转发+整理)
  6. MFC 多文档中同时打开多个文档
  7. 简单说说Linux中valgrind进行内存检测
  8. 针对不同的系统的宏定义
  9. QTP - 描述性编程
  10. 在网上看到一个故事,我觉得挺感人
  11. 老男孩36期运维脱产班---- 决心书
  12. ubuntu18.04中tomcat8.5启动时报找不到JAVA_HOME和JRE_HOME
  13. JavaScript 变量提升
  14. 在cmakelists和makefile中设置opencv
  15. python正则匹配中文或数字_Python匹配中文的正则表达式
  16. iSCSI服务部署网络存储---共享网络存储设备
  17. Android 调用12306接口,聚合数据Android SDK 12306火车票查询订票演示示例 编辑
  18. 分别实现:css动画、js动画、vue动画
  19. Ubuntu 18.04 新手教程_火狐浏览器flash插件安装
  20. Xcode 12 GM发行说明,快来看看SwiftUI和Swift都更新哪些新技术吧

热门文章

  1. My97时间插件使用、My97设置日期控件日期格式
  2. 新道格会客间 人才引领企业 注入科创源动力
  3. 面试-vue组件间通信
  4. 纸上得来终觉浅(experience is the best teacher)
  5. Shell(Bash) - PHP与Sheel交互
  6. PWM接口测试工装研究
  7. 计算机毕业设计springboot交通违章管理系统的设计与实现s7830源码+系统+程序+lw文档+部署
  8. 设计一个车辆违章系统
  9. 《MATLAB 神经网络43个案例分析》:第19章 基于SVM的手写字体识别
  10. ioncube 加密项目本地搭建