策略模式

基本介绍

1.策略模式中,定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

2.一个类的行为或其算法可以在运行时更改,创建表示各种策略的对象和一个行为随着策略对象改变而改变的 Context 对象,策略对象改变 Context 对象的执行算法

 

角色

1.Context:环境角色,聚合、调用 Strategy 对象,根据传入不同的 ConcreteStrategy 对象,调用不同策略

2.Strategy:抽象策略角色,接口,定义、封装算法族

3.ConcreteStrategy:具体策略角色,实现 Strategy 接口,实现具体的策略算法

 

事项

1.核心

(1)从不变的代码中分离变化的代码

(2)定义了策略接口,针对接口编程而不是具体类

(3)多用组合/聚合,少用继承

2.优点

(1)算法可以自由切换,动态地让一个对象在许多行为中选择一种行为

(2)避免使用多重条件判断(if else)

(3)符合开闭原则,扩展性良好

3.缺点

(1)每添加一个策略就要增加一个类,当策略过多是会导致类数目庞大

(2)所有策略类都需要对外暴露

4.应用场景

(1)一个系统里面有许多类,之间区别仅在于行为

(2)一个系统需要动态地在几种算法中选择一种

 

策略模式、状态模式

1.策略模式:控制对象使用什么策略,策略是手动转换的

2.状态模式:状态模式会自动改变状态,在相关的状态类方法里面封装转换的过程,状态的改变是在状态内部发生的,在执行动作时进行自动的转换

 

JDK 中的 Arrays 的 Comparator

1.匿名类对象 new Comparator<Integer>() {} 实现了 Comparator 接口(策略接口)

2.public int compare(Integer o1, Integer o2) {} 指定具体的处理方式,即策略

 

代码示例

public class Client {//客户端

    public static void main(String[] args) {
        Add add = new Add();
        Subtract subtract = new Subtract();
        Multiply multiply = new Multiply();
        Divide divide = new Divide();
        Context context = new Context();
        context.setStrategy(add);
        context.execute();
        System.out.println("Context 在 Add 策略下,result = " + context.result);
        context.setStrategy(subtract);
        context.execute();
        System.out.println("Context 在 Subtract 策略下,result = " + context.result);
        context.setStrategy(multiply);
        context.execute();
        System.out.println("Context 在 Multiply 策略下,result = " + context.result);
        context.setStrategy(divide);
        context.execute();
        System.out.println("Context 在 Divide 策略下,result = " + context.result);
    }
}

class Context {//环境角色
    private Strategy strategy;
    public int num1 = 10;
    public int num2 = 5;
    public int result;

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void execute() {//调用策略
        result = strategy.operation(num1, num2);
    }
}

interface Strategy {//抽象策略角色

    int operation(int num1, int num2);
}

class Add implements Strategy {//具体策略1

    @Override
    public int operation(int num1, int num2) {
        return num1 + num2;
    }
}

class Subtract implements Strategy {//具体策略2

    @Override
    public int operation(int num1, int num2) {
        return num1 - num2;
    }
}

class Multiply implements Strategy {//具体策略3

    @Override
    public int operation(int num1, int num2) {
        return num1 * num2;
    }
}

class Divide implements Strategy {//具体策略4

    @Override
    public int operation(int num1, int num2) {
        return num1 / num2;
    }
}

 

posted @   半条咸鱼  阅读(78)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示