【结构型】- 组合模式

组合模式


将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性

角色


  • 抽象构件角色(Component):组合中对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明1个接口用于访问和管理Component子部件,接口可用于管理所有的子对象。(可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它

  • 树枝构件角色(Composite):定义有子部件的那些部件的行为。存储子部件,在Component接口中实现与子部件有关的操作

  • 树叶构件角色(Leaf):在组合树中表示叶节点对象,叶节点没有子节点。并在组合中定义图元对象的行为

  • 客户角色(Client):通过component接口操纵组合部件的对象


抽象构件角色: Number

package com.zhiwei.composite;
public interface Number {
    double computer(double x, double y);
}

树叶构件角色

package com.zhiwei.composite;

public class AddNumber implements Number {
    public double computer(double x, double y) {
    	double result = x + y;
    	System.out.println("AddNumber计算结果:"+result);
        return result;
    }
}
package com.zhiwei.composite;

public class SubNumber implements Number {

    public double computer(double x, double y) {
        double result = x - y;
        System.out.println("SubNumber计算结果:"+result);
        return result;
    }
}
package com.zhiwei.composite;

public class MulNumber implements Number {

    public double computer(double x, double y) {
        double result = x * y;
        System.out.println("MulNumber计算结果:"+result);
        return result;
    }
}
package com.zhiwei.composite;
public class DivNumber implements Number {

    public double computer(double x, double y) {
        double result = x/y;
        System.out.println("DivNumber计算结果:"+result);
        return result;
    }
}

树枝构件角色:CompositeNumber

package com.zhiwei.composite;

import java.util.List;
import java.util.ArrayList;

public class CompositeNumber implements Number {
	
    private List<Number> list = new ArrayList<Number>();

    public void add(Number organ) {
        list.add(organ);
    }

    public void remove(Number organ) {
        list.remove(organ);
    }

    public Number getChild(int i) {
        return list.get(i);
    }

    public double computer(double x, double y) {

        double count = 0d;
        for (int i = 0; i < list.size(); i++) {
            Number number = list.get(i);
            count += number.computer(x,y);
        }
        return count;
    }
}

测试代码:

CompositeNumber compositeNumber = new CompositeNumber();

compositeNumber.add(new AddNumber());  //加法:8
compositeNumber.add(new SubNumber());  //减法:4
compositeNumber.add(new MulNumber());  //乘法:12
compositeNumber.add(new DivNumber());  //除法:3

//8+4+12+3=27
System.out.println("总运算结果为:"+ compositeNumber.computer(6,2));

结果:


组合模式分析

组合模式中,枝干和树叶组件根据Java多态特点,通过接口联系在一起,树叶组件负责实现具体的功能(功能比较单一),树枝组件通过组合树叶组件来实现不同的功能,这种设计思想和外观设计模式很类似,外观类也是通过组合内部的子系统的功能,为客户端提供统一的访问接口,只是组合模式职责更加单一

转载于:https://my.oschina.net/yangzhiwei256/blog/3012135

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值