设计模式之Composite模式(笔记)

组合模式:将对象组合成树形结构以表示“部分-总体”的层次结构。

组合模式使得用户对单个对象和组合对象的使用具有一致性。

适用场合:当需求中是体现部分与总体层次的结构时,以及希望用户能够忽略组合对象与单个对象的不同,统一地使用组合结构中的全部对象时,就应该考虑用组合模式。

首先定义一个Componet抽象类

public abstract class Component {
    protected String name;

    public Component(String name){
        this.name=name;
    }
    //抽象方法
    public abstract void add(Component c);
    public abstract void delete(Component c);
    public abstract void dispaly(int depth);
}

定义叶结点对象Leaf,继承Componet

public class Leaf extends Component {

    public Leaf(String name) {
        super(name);

    }

    @Override
    public void add(Component c) {
        System.out.println("can not add a leaf");

    }

    @Override
    public void delete(Component c) {
        System.out.println("can not delete a leaf");

    }

    @Override
    public void dispaly(int depth) {
        char[] ch=new char[depth];
        for(int i=0;i<depth;i++){
            ch[i]=‘-‘;
        }
        System.out.println(new String(ch)+name);
    }
}

结点定义枝结点Composite继承Component

public class Composite extends Component{

    private List<Component> children=new ArrayList<Component>();
    public Composite(String name) {
        super(name);
    }

    @Override
    public void add(Component c) {

        children.add(c);
    }

    @Override
    public void delete(Component c) {
        children.remove(c);

    }

    @Override
    public void dispaly(int depth) {
        char[] ch=new char[depth];
        for(int i=0;i<depth;i++){
            ch[i]=‘-‘;
        }
        System.out.println(new String(ch)+name);
        Iterator<Component> iterator=children.iterator();
        while(iterator.hasNext()){
            Component component=iterator.next();
            component.dispaly(depth+2);
        }
    }
   }

client代码


       public static void main(String[] args) {
         //组合模式
        Composite root=new Composite("root");
        root.add(new Leaf("LeafA"));
        root.add(new Leaf("LeafB"));
        Composite comp=new Composite("Composite X");
        comp.add(new Leaf("LeafXA"));
        comp.add(new Leaf("LeafXB"));
        root.add(comp);

        Composite comp2=new Composite("Composite Y");
        comp2.add(new Leaf("LeafXYA"));
        comp2.add(new Leaf("LeafXYB"));
        root.add(comp2);

        root.add(new Leaf("LeafC"));

        root.dispaly(1);
}

结果:

-root

- - -LeafA

- - -LeafB

- - -Composite X

- - - - -LeafXA

- - - - -LeafXB

- - -Composite Y

- - - - -LeafXYA

- - - - -LeafXYB

- - -LeafC

时间: 2024-10-08 10:17:03

设计模式之Composite模式(笔记)的相关文章

Android与设计模式——组合(Composite)模式

定义(GoF<设计模式>):将对象组合成树形结构以表示"部分整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性.  涉及角色 1.Component:(View)是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为.声明一个接口用于访问和管理Component子部件. 2.Leaf:(TextView.自定义View)在组合中表示叶子结点对象,叶子结点没有子结点(即不能在View内再添加View). 3.Composite:(ViewGr

设计模式:Composite模式

设计模式:组合(Composite)模式 一.前言   关于Composite模式,其实就是组合模式,又叫部分整体模式,这个模式在我们的生活中也经常使用,比如说如果读者有使用Java的GUI编写过程序的,肯定少不了定义一些组件,初始化之后,然后使用容器的add方法,将这些组件有顺序的组织成一个界面出来:或者读者如果编写过前端的页面,肯定使用过<div>等标签定义一些格式,然后格式之间互相组合,通过一种递归的方式组织成相应的结构.这种方式其实就是组合,将部分的组件镶嵌到整体之中.那么凭什么可以这

浅谈设计模式之七——Composite模式

同样地,先上uml图: 组合模式的意图:将对象组合合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. uml解析:leaf是叶节点,Composite可以理解为是一个多个叶节点的组合,它是非叶节点,就相当于一个元件以及一个元件容器,里面有很多元件一样.这里可以用list或者vector实现. 本来是想用模板来实现,后来发现实在是多此一举,而且反而更不好了. 这里需要说的一点就是Leaf是叶节点,因此肯定没有添加.删除等功能,因为

设计模式之代理模式笔记

原文地址:点我 关键点: 静态代理: 实现被代理类的接口 构造注入 动态代理 reflect  高级码农必须深入理解的 扩展知识点 class.forname 使用这个不会产生新的实例, 只是为了加载 链接 初始化(静态) 我们大家一直用的spring 其中强大的功能aop就是基于这 注意点: 动态代理有个强制性要求 被代理的类必须时间了某一个接口, 或者本身就是接口(这个接口的实现类非必要) 三步骤 构造注入 实现invoke 获取代理实例 参数 类加载器 class对象的数组 当前对象 接口

C++设计模式 之 “数据结构” 模式:Composite、Iterator、Chain of Resposibility

"数据结构"模式 常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用.这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案. 典型模式 #Composite #Iterator #Chain of Resposibility part 1 Composite 模式 动机 #软件在某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)

C++设计模式实现--组合(Composite)模式

一. 举例 这个例子是书上的,假设有一个公司的组结结构如下: 它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点. 而且最关健的是,它的每一层结构很相似. 代码实现如下: #include <iostream> #include <list> #include <string> using namespace std; //公司类,提供接口 class Company { public: Company(string name) { m_nam

【笔记】设计模式——装饰者模式

实现一个类似QQavator功能的代码 1.原始实现 1 //存在的问题: 2 //1.wear*方法出现重复代码,可以重构:实质上为代码结构一致,输出内容相同,可以通过在定义一个基类,在基类中定义抽象的Wear*,在子类中重写: 3 //2.倘若需求中新增某种服饰,需要修改Person类代码,不符合开放--封闭原则: 4 //3.客户端中代码暴露了具体装饰细节,理想情况下只需要提供装饰顺序,装饰细节封装起来: 5 class Person 6 { 7 private string name;

设计模式之组合模式(Composite)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

JavaScript设计模式之策略模式(学习笔记)

在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选择学习策略模式. 策略模式:定义了一系列家族算法,并对每一种算法单独封装起来,让算法之间可以相互替换,独立于使用算法的客户. 通常我并不会记得“牛顿第一定律”的具体内容,所以我也难保证我会对这个定义记得多久……用FE经常见到的东西来举个例子说明一下: $("div").animation(