美文网首页
设计模式之组合模式

设计模式之组合模式

作者: 古月沧澜 | 来源:发表于2019-05-01 13:20 被阅读0次

举例

1.例子

代码

1.公司组件

/**抽象构件,组合模式的精髓
 * Created by Administrator on 2019/4/22.
 */
public abstract class Corp {

private String name;
private String position;
private Integer salary;


public Corp(String name, String position, Integer salary) {
        this.name = name;
        this.position = position;
        this.salary = salary;
        }


public String getInfo() {
        return toString();
    }

2.树枝组件

 /**树枝节点
 * Created by Administrator on 2019/4/22.
 */
public class Branch extends Corp {
    private ArrayList<Corp> arrayList=new ArrayList<Corp>();

    public void add(Corp corp){
        arrayList.add(corp);
    }

    public ArrayList<Corp> getArrayList() {
        return arrayList;
    }


    public Branch(String name, String position, Integer salary) {
        super(name, position, salary);
    }
}

3.叶子组件

/**
 * Created by Administrator on 2019/4/22.
 * 叶子节点
 */
public class Leaf extends Corp {


    public Leaf(String name, String position, Integer salary) {
        super(name, position, salary);
    }
}

4.场景类


/**组合模式
 * 优势
 * 1.高层模块调用更加轻松,
 * 2.增加、删除子节点更加方便、非常容易扩展、符合开闭原则,易于维护和扩展。
 * 问题:
 * 1:不符合依赖倒置原则
 * 2,不是面向接口编程,很不恰当,用的时候参考是否限制了接口的影响范围
 * 适用场景:
 * 1.树形结构,局部和整体的结构中,可以用此类结构进行编写,一定要用此结构
 * Created by Administrator on 2019/4/22.
 */
public class Cilent {

    public static void main(String[]args){
          Branch root=new Branch("老王","总经理",10000);
          Branch branch=new Branch("老张","销售部部总经理",8000);
          Leaf leaf=new Leaf("老刘","销售员工",5000);
          branch.add(leaf);
          root.add(branch);

          System.out.println(display(root));
    }

    //默认前序遍历,给一个根节点,便可以遍历整棵树。
    public static String display(Branch root){
        ArrayList<Corp> arrayList = root.getArrayList();
        String info=root.getInfo();
        for(Corp corp:arrayList){
            if(corp instanceof Leaf){
                //返回一个完整的树的信息
                info=info+corp.getInfo();
            }else {
                info=info+display((Branch)corp);
            }
        }
        return info;
    }
}

5、运行结果

name='老王', position='总经理', salary=10000name='老张', position='销售部部总经理', salary=8000name='老刘', position='销售员工', salary=5000

模式说明

含义:

组合模式又叫部分整体模式

角色

1.抽象构件角色:组合模式的精髓,定义参加组合模式对象的共有属性和方法,可以定义一些默认的属性和方法,如上例子中的getInfo().

2.叶子构件:叶子对象,下面再没有其它分支,遍历的最小单位

3.树枝构件:叶子节点,左右是组合叶子结点和树枝节点形成一个树形结构。

通用代码

1.抽象构件

/**抽象构件类
 * Created by Administrator on 2019/4/25.
 */
public class Component {
      public void doSomething(){

      }
}

2.树枝节点


/**树枝节点
 * Created by Administrator on 2019/4/22.
 */
public class Composite extends Component {
    private List<Component> subCompositeList=new ArrayList<Component>();
    public void  add(Component component){
        subCompositeList.add(component);
    }
    public void remove(Component component){
        subCompositeList.remove(component);
    }
    public List<Component> getSubCompositeList(){
        return subCompositeList;
    }
}

3.叶子结点

/**树叶节点
 * Created by Administrator on 2019/4/22.
 */
public class Leaf extends Component {
    @Override
    public void doSomething() {
        super.doSomething();
    }
}
使用场景

1.对于树形结构,一定要考虑使用组合模式
2.对于部分整体的结构,并且这种结构比较深的时候,需要考虑使用组合模式。

优势

1.高层模块调用简单,无论是叶子组件还是树枝组件,对于高层来说都是构件,高层不需要知道是什么构件,统一只有一个Component组件,这样高层模块调用起来会非常简单。
2.增加、删除子节点非常容易,符合开闭原则,易于维护和扩展

劣势

1.组合模式组件类用的都是实现类,违背了依赖倒置原则,并且不符合面向接口编程,写的时候需要考虑此模式限制了接口的影响范围。

扩展

安全模式:

前面的例子为安全模式

透明模式:

1.类图:
2.说明:将对子节点的增删改查放入抽象组件中,通过getChild()返回是否为空来判断是叶子结点还是树枝节点,这样在运行期会有问题。
3.代码:
1.抽象组件

/**
 * Created by Administrator on 2019/4/28.
 */
public abstract class Component {

    protected List<Component> subCompositeList=new ArrayList<Component>();
    public abstract void  add(Component component);
    public abstract void remove(Component component);
    public abstract List<Component> getSubCompositeList();

    public void doSomething(){

    };
}

2.树枝节点


/**
 * Created by Administrator on 2019/4/28.
 */
public class Composite extends Component {

    public void  add(Component component){
        subCompositeList.add(component);
    }
    public void remove(Component component){
        subCompositeList.remove(component);
    }

    @Override
    public List<Component> getSubCompositeList() {
        return subCompositeList;
    }
}

3,叶子结点

/**
 *
 * Created by Administrator on 2019/4/28.
 */
public class Leaf extends Component {

    @Override
    public void add(Component component) throws UnsupportedOperationException{
        //直接跑出不支持请求的类
        throw new UnsupportedOperationException();
    }

    @Override
    public void remove(Component component) throws UnsupportedOperationException{
         throw new UnsupportedOperationException();
    }

    @Override
    public List<Component> getSubCompositeList() throws UnsupportedOperationException{
        throw new UnsupportedOperationException();
    }
}

相关文章

  • Android设计模式——组合模式(七大结构型)

    1.组合模式介绍 组合模式(Composite Pattern)也称为部分整体模式,是七大结构型设计模式之...

  • 组合模式

    设计模式之组合模式 什么是组合模式? 组合模式允许你将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户以...

  • 组合模式

    设计模式系列7--组合模式 《Objective-c 编程之道 iOS 设计模式解析》 - 组合模式 常见组合模式...

  • 设计模式

    设计模式之组合模式 最新在工作之余,看了看这个设计模式,关于设计模式有很多种。最最常见的就是这个MVC模式或者...

  • Android 组合模式(View与ViewGroup)

    Android 设计模式系列文章 Android 23种设计模式 前言 组合设计模式,又被称为部分整体模式。组合模...

  • 设计模式之组合模式

    组合模式(Composite),将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组...

  • 设计模式之组合模式

    1. 定义 组合模式,又叫部分整体模式,用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用...

  • 设计模式之组合模式

    设计模式之组合模式 1.组合模式的定义 将对象组合成树形结构以表示"部分-整体"的层次结构,使得用户对单个对象和组...

  • 设计模式之组合模式

    组合模式的定义 组合模式(Composite Pattern)也叫合成模式,有时候也叫整体-部分模式,主要用来描述...

  • 设计模式之组合模式

    组合模式 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用...

网友评论

      本文标题:设计模式之组合模式

      本文链接:https://www.haomeiwen.com/subject/iqminqtx.html