本文作者:开源技术之家

设计模式之组合模式

开源技术之家 2年前 ( 2018-07-17 ) 963 百度已收录
设计模式之组合模式摘要: 什么是组合模式?使对象组合成树形的结构。使用户对单个对象和组合对象的使用具有一致性。组合模式角色——抽象构件角色(Component):为组合中的对象声明接口, 在适当的情况下,也...

什么是组合模式

使对象组合成树形的结构。使用户对单个对象和组合对象的使用具有一致性。

组合模式角色

——抽象构件角色(Component):为组合中的对象声明接口, 在适当的情况下,也可实现所有类共有接口的缺省行为。

——树叶构件角色(Leaf):在组合中表示叶节点对象,没有子节点,实现抽象构件角色声明的接口。

——树枝构件角色(Composite):在组合中表示分支节点对象,有子节点,实现抽象构件角色声明的接口;存储子部件

组合模式场景

  1 表示对象的 部分-整体 层次结构

  2 忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象。

组合模式两种实现方式

——透明式的组合模式:将管理子构件的方法定义在Component接口中,这样Leaf类就需要处理这些对其意义不大的方法(空实现或抛异常),在接口层次上Leaf和Composite没有区别,即透明性。Component 声明的这些管理子构件的方法对于Leaf来说是不适用的,这样也就带来了一些安全性问题。


——安全式的组合模式:将管理子构件的方法定义在Composite中,这样编译时任何从Leaf 中增加或删除对象的尝试都将被发现,但是由于Leaf和Composite有不同的接口(方法),又失去了透明性。


组合模式代码讲解

【安全的组合模式】

  这种组合模式,叶子节点,也就是单个对象不具有对象的控制功能。仅仅有简单的业务操作。

public interface Component {

    Composite getCmposite();

    void sampleComposite();

}

class Leaf implements Component{

    @Override
    public Composite getCmposite() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void sampleComposite() {
        // TODO Auto-generated method stub
        System.out.println("Leaf operation");
    }
    
}


class Composite implements Component {

    List<Component> list = new ArrayList<Component>();

    @Override
    public Composite getCmposite() {
        // TODO Auto-generated method stub
        return this;
    }

    @Override
    public void sampleComposite() {
        // TODO Auto-generated method stub
        
        System.out.println("Composite operation");
        for (Component com : list) {
            com.sampleComposite();
        }
        
        
    }

    public void add(Component component) {
        list.add(component);
    }

    public void remove(Component component) {
        list.remove(component);
    }

}

测试:

public static void main(String[] args) {

        Component leaf1 = new Leaf();
        Component leaf2 = new Leaf();
        Component composite = new Composite();
        composite.getCmposite().add(leaf1);
        composite.getCmposite().add(leaf2);
        composite.getCmposite().sampleComposite();

    }

 执行结果

Composite operation
Leaf operation
Leaf operation

 【透明的组合模式】

  这种组合模式,叶子节点与组合对象具有相同的方法,外表看来毫无差异。不过叶子节点的处理方法默认为空。忽略叶子节点,与组合对象的差异性。

public interface Component {

    Composite getCmposite();

    void sampleComposite();
    
    public void add(Component component) ;
    
    public void remove(Component component);

}

class Leaf implements Component {

    @Override
    public Composite getCmposite() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void sampleComposite() {
        // TODO Auto-generated method stub
        System.out.println("Leaf operation");
    }

    @Override
    public void add(Component component) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void remove(Component component) {
        // TODO Auto-generated method stub
        
    }

}

class Composite implements Component {

    List<Component> list = new ArrayList<Component>();

    @Override
    public Composite getCmposite() {
        // TODO Auto-generated method stub
        return this;
    }

    @Override
    public void sampleComposite() {
        // TODO Auto-generated method stub

        System.out.println("Composite operation");
        for (Component com : list) {
            com.sampleComposite();
        }

    }

    @Override
    public void add(Component component) {
        list.add(component);
    }

    @Override
    public void remove(Component component){
        list.remove(component);
    }



}


本文标题:设计模式之组合模式
本文链接:https://www.kyjszj.com/wdzl/22.html
作者授权:除特别说明外,本文由 开源技术之家 原创编译并授权 开源技术之家 刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。
文章版权及转载声明

作者:开源技术之家本文地址:https://www.kyjszj.com/wdzl/22.html发布于 2年前 ( 2018-07-17 )
文章转载或复制请以超链接形式并注明出处开源技术之家

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏