设计模式系列之「组合模式」(1)

小Y科普: 家谱又称族谱、宗谱等。它以记载父系家族世系、人物为中心,由正史中的帝王本纪及王侯列传、年表等演变而来。是一种特殊的文献,就其内容而言,是中国五千年文明史中具有平民特色的文献,记载的是同宗共祖血缘集团世系人物和事迹等方面情况的历史图籍。

Now,how to 实现 小J’s 族谱。

一、小J族谱简略版

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从最顶层的第一代J开始,一代代往下记录下去,这很明显就是一个树状结构,现在小Y要做的就是通过最合适的方式把小J的族谱图遍历出来。

二、树状图的拆解利器-组合模式

1.组合模式的定义

组合模式也叫合成模式,有时又叫做部分-整体模式,主要是用来描述部分与整体的关系,将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

2.组合模式的角色介绍(组合模式有两种实现:安全模式和透明模式)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • Component抽象构件角色
    定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性。

  • Leaf叶子构件
    Leaf叶子构件叶子对象,其下再也没有其他的分支,也就是遍历的最小单位。

  • Composite树枝构件
    树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构。组合模式的重点就在树枝构件。

3.组合模式的使用场景
  • 只要是树形结构或者只要是要体现局部和整体的关系的时候,而且这种关系还可能比较深,就要考虑一下组合模式。

  • 从一个整体中能够独立出部分模块或功能的场景。

  • 维护和展示部分-整体关系的场景。

4.安全模式和透明模式的具体实现

(1)安全模式

①抽象构件

public abstract class Component {
//个体和整体都具有
public void operation(){
//编写业务逻辑
}
}

②树枝构件

public class Composite extends Component {
//构件容器
private List componentArrayList = new ArrayList();
//增加一个叶子构件或树枝构件
public void add(Component component){
this.componentArrayList.add(component);
}
//删除一个叶子构件或树枝构件
public void remove(Component component){
this.componentArrayList.remove(component);
}
//获得分支下的所有叶子构件和树枝构件
public List getChildren(){
return this.componentArrayList;
}
}

③树叶构件

public class Leaf extends Component {
/*

  • 可以覆写父类方法
  • public void operation(){
  • }
    */
    }

④Client

public class Client {
public static void main(String[] args) {
//创建一个根节点
Composite root = new Composite();
root.operation();
//创建一个树枝构件
Composite branch = new Composite();
//创建一个叶子节点
Leaf leaf = new Leaf();
//建立整体
root.add(branch);
branch.add(leaf);
}

//通过递归遍历树
public static void showTree(Composite root){
for(Component c:root.getChildren()){
if(c instanceof Leaf){ //叶子节点
c.operation();
}else{ //树枝节点
showTree((Composite)c);
}
}
}
}

(2)透明模式

①抽象构件

public abstract class Component {
//个体和整体都具有
public void operation(){
//编写业务逻辑
}
//增加一个叶子构件或树枝构件
public abstract void add(Component component);
//删除一个叶子构件或树枝构件
public abstract void remove(Component component);
//获得分支下的所有叶子构件和树枝构件
public abstract List getChildren();
}

②树枝构件

public class Composite extends Component {
//构件容器
private ArrayList componentArrayList = new ArrayList();
//增加一个叶子构件或树枝构件
public void add(Component component){
this.componentArrayList.add(component);
}
//删除一个叶子构件或树枝构件
public void remove(Component component){
this.componentArrayList.remove(component);
}
//获得分支下的所有叶子构件和树枝构件
public List getChildren(){
return this.componentArrayList;
}
}

③树叶构件

public class Leaf extends Component {

public void add(Component component){
//空实现
}

public void remove(Component component){
//空实现
}

public List getChildren(){
//空实现
}
}

④Client

public class Client {

public static void main(String[] args) {
//创建一个根节点
Composite root = new Composite();
root.operation();
//创建一个树枝构件
Composite branch = new Composite();
//创建一个叶子节点
Leaf leaf = new Leaf();
//建立整体
root.add(branch);
branch.add(leaf);
}

//通过递归遍历树
public static void showTree(Component root){
for(Component c:root.getChildren()){
if(c instanceof Leaf){ //叶子节点
c.operation();
}else{ //树枝节点
showTree©;
}
}
}
}

4.安全模式和透明模式的区别
  • 安全模式在抽象组件中只定义一些默认的行为或属性,它是把树枝节点和树叶节点彻底分开;透明模式是把用来组合使用的方法放到抽象类中,不管叶子对象还是树枝对象都有相同的结构,通过判断确认是叶子节点还是树枝节点,如果处理不当,这个会在运行期出现问题,不是很建议的方式。

  • 安全模式与依赖倒置原则冲突;透明模式的好处就是它基本遵循了依赖倒转原则,方便系统进行扩展。

  • 安全模式在遍历树形结构的的时候需要进行强制类型转换;在透明模式下,遍历整个树形结构是比较容易的,不用进行强制类型转换。

三、通过安全模式实现遍历小J的族谱

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

①抽象构件抽象族员类

public abstract class PersonMode {
//人名
private String name;
//性别
private String sex;
//年龄
private int age;

public PersonMode(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}

//个人信息
public String getPersonInfo(){
String info=“姓名:”+name+“\t性别:”+sex+“\t年龄:”+age;
return info;
}
}

②树叶构件

public class PersonLeaf extends PersonMode {
//写一个构造函数
public PersonLeaf(String name, String sex, int age) {
super(name, sex, age);
}
}

③树枝构件

public class PersonBranch extends PersonMode {
private List personModeList=new ArrayList<>();

public PersonBranch(String name, String sex, int age) {
super(name, sex, age);
}

文末

我总结了一些Android核心知识点,以及一些最新的大厂面试题、知识脑图和视频资料解析。

以后的路也希望我们能一起走下去。(谢谢大家一直以来的支持)

部分资料一览:

  • 330页PDF Android学习核心笔记(内含8大板块)

  • Android学习的系统对应视频

  • Android进阶的系统对应学习资料

  • Android BAT大厂面试题(有解析)


《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
Ne-1715394891801)]

  • Android学习的系统对应视频

  • Android进阶的系统对应学习资料

[外链图片转存中…(img-7IIFcvjU-1715394891802)]

  • Android BAT大厂面试题(有解析)

[外链图片转存中…(img-baR66Bjw-1715394891802)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值