组合模式(Bridge Pattern) – 设计模式之结构型模式
组合模式(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) – 设计模式之结构型模式相关推荐
- 设计模式:结构型模式-桥接、外观、组合、享元模式
结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦 ...
- 设计模式之结构型模式
结构型模式 一.适配器模式 (一)定义:适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁,它结合了两个独立接口的功能.这种模式涉及到一个单一的类,该类负责加入独立的或不兼容 ...
- 设计模式05——结构型模式
一.概述 结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象.由于组合关系或聚合关系比继承关系耦合 ...
- 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)
本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...
- 设计模式 之 结构型模式
设计模式 之 结构型模式 模式 & 描述 包括 结构型模式 这些设计模式关注类和对象的组合.继承的概念被用来组合接口和定义组合对象获得新功能的方式. 适配器模式(Adapter Pattern ...
- 设计模式之结构型模式(5种)
目录 结构型模式(Structural Pattern):怎么构造一个对象(行为.属性) 一.适配器模式 二.桥接模式(Bridge) 三.装饰者模式 设计模式在JAVA I/O库中的应用 案例 使用 ...
- 设计模式3——结构型模式
结构型模式描述如何将类或对象按某种布局组成更大的结构,它分为类结构型和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足&q ...
- Java最全的设计模式之结构型模式
这篇接着上篇,结构型模式包含了七种,没有看过上篇的可以点击超链接 Java设计模式之创建型模式 Java设计模式之创建型模式 9.适配器模式 9.1结构型模式 9.2适配器模式的定义 9.3适配器模式 ...
- 设计模式_结构型模式学习
其中,单例模式用来创建全局唯一的对象.工厂模式用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象.建造者模式是用来创建复杂对象,可以通过设置不同的可 ...
最新文章
- Delphi之对象库(Object Repository)
- 距离和相似性度量方法
- MySQL主从原理,基于快速学习一门技术的3种方式!
- 微信小程序-封装http请求(ajax)
- PostgreSQL流复制之二:pgpool-II实现PostgreSQL数据库集群(转发+整理)
- MFC 多文档中同时打开多个文档
- 简单说说Linux中valgrind进行内存检测
- 针对不同的系统的宏定义
- QTP - 描述性编程
- 在网上看到一个故事,我觉得挺感人
- 老男孩36期运维脱产班---- 决心书
- ubuntu18.04中tomcat8.5启动时报找不到JAVA_HOME和JRE_HOME
- JavaScript 变量提升
- 在cmakelists和makefile中设置opencv
- python正则匹配中文或数字_Python匹配中文的正则表达式
- iSCSI服务部署网络存储---共享网络存储设备
- Android 调用12306接口,聚合数据Android SDK 12306火车票查询订票演示示例 编辑
- 分别实现:css动画、js动画、vue动画
- Ubuntu 18.04 新手教程_火狐浏览器flash插件安装
- Xcode 12 GM发行说明,快来看看SwiftUI和Swift都更新哪些新技术吧