idea2020旗舰版没有java enterprise_java设计模式之组合模式

a02ac8358ccc938e924c720ac6a8a4ad.png

模式定义
组合(Composite Pattern)模式的定义:有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性,这种类型的设计模式属于结构型模式。模式解决的问题
将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

05ce26cc87c6c5a525175db2904662ad.png

模式角色
抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。
树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口。
树枝构件(Composite)角色:是组合中的分支节点对象,它有子节点。它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。

3d0eed4ef01733fa1b473c77769c6701.png

代码实现

/**
 * Created by zengjianlu on 2018/2/24.
 * @author zengjianlu
 */
public class TreeNode {
    private String name;
    private TreeNode parent;
    private Vector<TreeNode> children = new Vector<TreeNode>();

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public TreeNode getParent() {
        return parent;
    }

    public void setParent(TreeNode parent) {
        this.parent = parent;
    }


    public void add(TreeNode node){
        children.add(node);
    }


    public void remove(TreeNode node){
        children.remove(node);
    }


    public Enumeration<TreeNode> getChildren(){
        return children.elements();
    }

    public void printChildren(){
        for(TreeNode treeNode : children){
            System.out.println(treeNode.toString());
            treeNode.printChildren();
        }
    }

    @Override
    public String toString() {
        return "TreeNode{" +
                "name='" + name + ''' +
                ", parent=" + parent +
                ", children=" + children +
                '}';
    }
}
/**
     * Created by zengjianlu on 2018/2/24.
     * @author zengjianlu
     */
    public class Tree {
        TreeNode root = null;
    
        public Tree(String name) {
            root = new TreeNode(name);
        }
    
        @Override
        public String toString() {
            return "Tree{" +
                    "root=" + root +
                    '}';
        }
    
        public static void main(String[] args) {
            Tree tree = new Tree("A");
            TreeNode nodeB = new TreeNode("B");
            TreeNode nodeC = new TreeNode("C");
            nodeB.add(nodeC);
            tree.root.add(nodeB);
            System.out.println("build the tree finished!");
            System.out.println(tree);
            tree.root.printChildren();
    
        }
    }
    }

da53149e851c096c48e837b8a6bacbc1.png

优缺点分析
优点:
组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;


缺点:
设计较复杂,客户端需要花更多时间理清类之间的层次关系;
不容易限制容器中的构件;
不容易用继承的方法来增加构件的新功能;

生活中模式情景再现
在现实生活中,存在很多“部分-整体”的关系。汽车与轮胎、发动机的关系。医院与科室、医生的关系。学校与学院、学生、老师的关系。

模式的启发
组合模式是一种非常普遍和常用的模式,接口服务互相组合,提供更丰富的接口,实现复杂的业务逻辑。一般情况会选择使用组合代替继承,组合更灵活、更方便。电影中的cp组合,也是制造看点,让双方的粉丝为其买单。

5a6e94d49bf18c612a8e5f7191134f56.png

推荐阅读

  • java设计模式之访问者模式,“见人说人话,见鬼说鬼话”
  • java设计模式之原型模式,本故事纯属虚构,如有雷同,纯属巧合
  • java设计模式之桥接模式,策略模式旗舰版,世界没有免费的午餐
  • java设计模式之代理模式,看我72变
  • java设计模式之构建模式,私人订制自己的创意
  • java设计模式之状态模式,策略模式的孪生兄弟
  • java设计模式之迭代器模式,顾客永远的上帝
  • java设计模式之模板模式,站在巨人的肩膀上成功
  • java设计模式之适配器模式,大丈夫能屈能伸
  • Head First 设计模式之命令模式,各司其职提高效率
  • Head First 设计模式之装饰器模式,因为参与,所以认同
  • Head First 设计模式之单例模式,每个人都是唯一
  • Head First 设计模式之观察者模式,你我都是发布者和订阅者
  • Head first 设计模式之策略模式,来源于生活,用之于生活更多文章:

15年经验的老兵推荐书单,高手是这样炼成的,你读了几本?

应用监控系列之谁开发谁运行谁监控

5a6e94d49bf18c612a8e5f7191134f56.png

3358f5d47d5dece0b99dad524f78d7c9.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值