- N +

设计模式之组合模式

设计模式之组合模式原标题:设计模式之组合模式

导读:

什么是组合模式?使对象组合成树形的结构。使用户对单个对象和组合对象的使用具有一致性。组合模式角色——抽象构件角色(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);
    }



}


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

有好的文章希望我们帮助分享和推广,猛戳这里我要投稿

返回列表
上一篇:
下一篇:

发表评论中国互联网举报中心

快捷回复:

    评论列表 (暂无评论,共465人参与)参与讨论

    还没有评论,来说两句吧...