动态改变执行方法

题目:有一个接口Processor,分别被ServiceA和ServiceB实现。

interface Processor {
    void process();
}

class ServiceA implements Processor {
    @Override
    public void process() {
        System.out.println("run ServiceA...");
    }
}

class ServiceB implements Processor {
    @Override
    public void process() {
        System.out.println("run ServiceB...");
    }
}

要求前10次由ServiceA运行,超过10次后自动切换成ServiceB运行。

代码如下:

interface Processor {
    void process();
}

class ServiceA implements Processor {
    @Override
    public void process() {
        System.out.println("run ServiceA...");
    }
}

class ServiceB implements Processor {
    @Override
    public void process() {
        System.out.println("run ServiceB...");
    }
}

public class DynamicRun {

    static class ProcessRunner implements Processor {

        private DelegateProcess target;
        private int runCount;

        private ServiceA defaultProcessor = new ServiceA();

        @Override
        public void process() {
            int count = ++this.runCount;
            System.out.println("默认运行次数:" + count);
            if (count >= 10) {
                System.out.println("默认运行次数到达10次,切换为ServiceB运行");
                // 将真正processor改为ServiceB
                this.target.setDelegate(new ServiceB());
            }

            defaultProcessor.process();
        }

        public void setTarget(DelegateProcess target) {
            this.target = target;
        }

    }

    static class DelegateProcess implements Processor {

        private Processor delegate;

        private DelegateProcess(Processor delegate) {
            this.delegate = delegate;
        }

        @Override
        public void process() {
            delegate.process();
        }

        public void setDelegate(Processor delegate) {
            this.delegate = delegate;
        }

    }

    public static void main(String[] args) {
        // 拿到这个processor,可在其它地方运行,不受约束
        Processor processor = buildProcessor();
        for (int i = 0; i < 15; i++) {
            processor.process();
        }
    }

    private static Processor buildProcessor() {
        ProcessRunner processRunner = new ProcessRunner();
        DelegateProcess delegateProcess = new DelegateProcess(processRunner);
        processRunner.setTarget(delegateProcess);
        return delegateProcess;
    }

}

此方式在JDK中也有出现,可以参考sun.reflect.ReflectionFactory.newMethodAccessor()方法。该方法在使用Method.invoke()时用到。代码片段如下:

NativeMethodAccessorImpl var2 = new NativeMethodAccessorImpl(var1);
DelegatingMethodAccessorImpl var3 = new DelegatingMethodAccessorImpl(var2);
var2.setParent(var3);
动态设置条件和动态设置执行是两个不同的概念。动态设置条件指的是在程序运行过程中,根据实际需要,对某个条件进行修改或者删除。例如,在订单系统中,可以根据用户的输入动态设置订单的筛选条件,以便更准确地找到符合要求的订单。动态设置执行则是指在程序运行过程中,根据某些条件,动态地选择不同的执行方式。例如,在一个游戏中,可以根据玩家的选择动态地切换游戏模式,以便提供更好的游戏体验。 这里给出一个动态设置条件的示例代码,以订单系统为例: ```java public class OrderFilter { private List<Order> orders; public void setOrders(List<Order> orders) { this.orders = orders; } public List<Order> filterByAmount(double minAmount, double maxAmount) { List<Order> filteredOrders = new ArrayList<>(); for(Order order : orders) { if(order.getAmount() >= minAmount && order.getAmount() <= maxAmount) { filteredOrders.add(order); } } return filteredOrders; } public List<Order> filterByStatus(OrderStatus status) { List<Order> filteredOrders = new ArrayList<>(); for(Order order : orders) { if(order.getStatus() == status) { filteredOrders.add(order); } } return filteredOrders; } } // 在使用时,可以根据用户的输入动态设置条件 OrderFilter orderFilter = new OrderFilter(); orderFilter.setOrders(orders); if(condition1) { List<Order> filteredOrders = orderFilter.filterByAmount(minAmount, maxAmount); // 处理符合条件的订单 } if(condition2) { List<Order> filteredOrders = orderFilter.filterByStatus(OrderStatus.PAID); // 处理符合条件的订单 } ``` 在上面的示例代码中,通过setOrders方法设置了订单列表,通过filterByAmount方法和filterByStatus方法筛选出符合条件的订单列表。在使用时,可以根据用户的输入动态设置条件,动态地筛选订单。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值