组合模式:多级好友列表展示

一、模式定义

  • 组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
  • 相关组件
  1. Component:组合中所有对象定义的一个接口(或抽象类)。
  2. Leaf:叶节点没有孩子。
  3. Composite:包含一个或多个子节点的组件。
  4. Client:客户端。

二、举例说明

  • 场景:当对象的结构需要树形方式来表示时,使用组合模式。
  • 需求:为了更细化好友的分组,目前需要支持在好友分组中创建子分组。如新建同学分组后,可以在这个分组中新建高中同学、大学同学分组,同时还可以直接在同学分组中添加好友。

三、代码实现

  1. 定义基础的好友组件
public abstract class FriendComponent {
    boolean add(FriendComponent friendComponent) {
        throw new UnsupportedOperationException();
    }

    boolean remove(FriendComponent friendComponent) {
        throw new UnsupportedOperationException();
    }

    FriendComponent getChild(int i) {
        throw new UnsupportedOperationException();
    }

    public abstract void print(String prefix);
}
  1. 继承FriendComponent 定义好友分组和具体的好友类
/**
 * 好友信息
 *
 * @author: jsk
 * @date: 2019/7/27 13:16
 */
public class FriendItem extends FriendComponent {

    private String name;

    public FriendItem(String name) {
        this.name = name;
    }

    @Override
    public void print(String prefix) {
        System.out.println(prefix + name);
    }
}

/**
 * 好友分组
 *
 * @author: jsk
 * @date: 2019/7/27 13:17
 */
public class FriendMenu extends FriendComponent {

    private String name;
    private List<FriendComponent> friendComponentList;

    public FriendMenu(String name, List<FriendComponent> friendComponentList) {
        this.name = name;
        this.friendComponentList = friendComponentList;
    }

    @Override
    boolean add(FriendComponent friendComponent) {
        return friendComponentList.add(friendComponent);
    }

    @Override
    boolean remove(FriendComponent friendComponent) {
        return friendComponentList.remove(friendComponent);
    }

    @Override
    FriendComponent getChild(int i) {
        return friendComponentList.get(i);
    }

    @Override
    public void print(String prefix) {
        System.out.println(prefix + name);
        for (FriendComponent friendComponent : friendComponentList) {
            friendComponent.print(prefix + "\t");
        }
    }
}
  1. 客户端打印
public class FriendClient {
    public static void main(String[] args) {
        FriendMenu friendMenu = initFriend();
        // 打印好友列表信息
        friendMenu.print("");
    }

    private static FriendMenu initFriend() {
        // 1.创建不同组的好友
        List<FriendComponent> highSchoolFriendList = new ArrayList<>();
        FriendMenu highSchoolFriendMenu = new FriendMenu("【高中同学】", highSchoolFriendList);
        highSchoolFriendMenu.add(new FriendItem("一根烟的温柔"));
        highSchoolFriendMenu.add(new FriendItem("匆匆那年灬亚楠"));
        highSchoolFriendMenu.add(new FriendItem("匆匆那年灬淇少"));
        highSchoolFriendMenu.add(new FriendItem("匆匆那年灬普少"));

        // 直接创建含有数据的list
        List<FriendComponent> universityFriendList = new ArrayList<FriendComponent>() {{
            add(new FriendItem("猛虎之坑王之王"));
            add(new FriendItem("32号嫁给你傲"));
            add(new FriendItem("32号嫁给你晨"));
            add(new FriendItem("32号嫁给你乐"));
        }};
        FriendMenu universityFriendMenu = new FriendMenu("【大学同学】", universityFriendList);

        // 2.合并组(在同学分组中添加"分组")
        List<FriendComponent> friendList = new ArrayList<FriendComponent>() {{
            add(highSchoolFriendMenu);
            add(universityFriendMenu);
        }};
        FriendMenu friendMenu = new FriendMenu("【同学】", friendList);
        // 在同学分组中添加"好友"
        friendMenu.add(new FriendItem("木叶小鬼"));
        friendMenu.add(new FriendItem("希望不排队"));
        return friendMenu;
    }
}

执行结果
组合模式:多级好友列表展示_第1张图片

你可能感兴趣的:(设计模式)