策略模式

策略模式用于分离算法和算法执行的环境,适用于算法变化多样的场景。下面以一个简单的命令行加减计算器的例子说明策略模式。
策略模式首先需要一个策略接口。在计算器例子中,策略接口是操作Operation,用来抽象加、减等操作。

public interface Operation {
    public int operate(int num1, int num2);
}

加操作、减操作是具体的操作类。
加操作

public class AddOperation implements Operation {
    @Override
    public int operate(int num1, int num2) {
        return num1 + num2;
    }
}

减操作

public class SubtractOperation implements Operation {
    @Override
    public int operate(int num1, int num2) {
        return num1 - num2;
    }
}

环境类Context封装整个计算器的行为,持有一个Operation接口的引用,并在构造方法中传入具体的Operation对象。

public class Context {
    private Operation oper;

    private int num1, num2;

    public Context(Operation oper) {
        this.oper = oper;
    }

    public void setNum1(int num1) {
        this.num1 = num1;
    }

    public void setNum2(int num2) {
        this.num2 = num2;
    }

    public int operate() {
        return oper.operate(num1, num2);
    }
}

在驱动类Main中,通过给计算器类Context传入不同的操作类,实现加/减法计算器。当操作增多时,还可以结合工厂模式,创建操作工厂类管理操作类(策略)。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        Context context = new Context(new AddOperation());
        System.out.println("--------- Add ---------");
        context.setNum1(scan.nextInt());
        context.setNum2(scan.nextInt());
        System.out.println("Result: " + context.operate());
        // --------- Add ---------
        // 1
        // 2
        // Result: 3

        context = new Context(new SubtractOperation());
        System.out.println("--------- Subtract ---------");
        context.setNum1(scan.nextInt());
        context.setNum2(scan.nextInt());
        System.out.println("Result: " + context.operate());
        // --------- Subtract ---------
        // 1
        // 2
        // Result: -1

        scan.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值