跳至主要內容

组合模式(结构)

文奚2019年11月30日Java设计模式约 1509 字大约 5 分钟

简介

组合模式也成为整体部分模式,是一种结构型设计模式。它将对象组合成树形的层次结构,用来表示“整体-部分”的关系。通过组合模式,我们可以使用相同的方式处理单个对象和多个对象组合。

结构

优缺点

优点:

缺点:

应用场景

生活场景

java场景

示例

下面以算数表达式为例。我们可以把算数表达式看作是一个树状结构,由操作符和操作数组成。

Expression-组件(Component)

/**
 * 组件(Component):算数表达式
 */
public interface Expression {
 
    //求值
    double evaluate();
}

Number-叶子节点(Leaf)

/**
 * 叶子节点(Leaf):数字
 */
public class Number implements Expression{
    private double val;
    public Number(double v){
        this.val=v;
    }
 
    @Override
    public double evaluate() {
        return val;
    }
}
/**
 * 叶子节点(Leaf):加法操作符
 */
public class AddOperator extends Operator{
    public AddOperator(Expression left, Expression right) {
        super(left, right);
    }
 
    @Override
    public double evaluate() {
        return left.evaluate() + right.evaluate();
    }
}
/**
 * 叶子节点(Leaf):加法操作符
 */
public class MulOperator extends Operator{
    public MulOperator(Expression left, Expression right) {
        super(left, right);
    }
 
    @Override
    public double evaluate() {
        return left.evaluate() * right.evaluate();
    }
}

Operation-组合节点(Composite)

/**
 * 组合节点(Composite):运算
 */
public abstract class Operator implements Expression{
    protected Expression left;
    protected Expression right;
 
    public Operator(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }
    
//    @Override
//    public double evaluate(){
//        return 0;
//    }
}

测试类

/**
 * 组合模式测试类
 */
@SpringBootTest
public class TestComposite {
   @Test
    void testComposite(){
        // 构建一个算数表达式: (2 + 3) * 4
        Expression expression = new MulOperator(
                new AddOperator(new Number(2), new Number(3)),
                new Number(4)
        );
        // 计算表达式的结果
        double result = expression.evaluate();
        System.out.println("(2+3)*4=" + result);
    }
}
(2+3)*4=20.0

总结

组合模式通过把叶子节点当成特殊的组合节点来看待,从而对叶子节点和组合节点能用相同的方式处理,下面总结一下组合模式在程序设计中的使用场景:

你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.3.0