码迷,mamicode.com
首页 > 其他好文 > 详细

策略模式

时间:2016-09-05 23:25:37      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:

介绍


当我们有一组算法需要进行切换的时候可以采用策略模式。

类图关系


技术分享

context:封装角色

它也叫上下文角色,起承上启下的封装作用,屏蔽高层模块对策略,算法的直接访问

Strategy:抽象策略角色

策略,算法家族的抽象,通常为接口,定义每个策略或算法必须具有的算法和属性。

ConcreteStratedy:具体策略角色

实现抽象策略中的操作,该类含有具体的算法

示例代码


抽象策略类

interface Strategy{
    //策略模式的运算法则
    public void doSomething();
}

具体策略类1

class ContreteStrategy1 implements Strategy{
    @Override
    public void doSomething(){
        System.out.println("具体策划类1的运算法则");
    }
}

具体策略类2

class ConcreteStragegy2 implements Strategy{
    @Override
    public void doSomething() {
        System.out.println("具体策略2的运算法则");
    }
}

上下文类

class Context{
    // 抽象策略
    private Strategy strategy = null;
    //构造函数设置具体策略
    public Context(Strategy _strategy){
        this.strategy = _strategy;
    }
    //封装后的策略方法
    public void doAnything(){
        this.strategy.doSomething();
    }
}

场景类

class Client{
    public static void main(String[] args) {
        String str = "策略1";
        Context context;
        //声明一个具体的策略
        Strategy strategy1 = new ContreteStrategy1();
        Strategy strategy2 =  new ConcreteStragegy2();
        //声明上下文对象
        if(str.equals("策略1"))
            context = new Context(strategy1);
        else
            context = new Context(strategy2);
        context.doAnything();
    }
}

场景类中根据不同情况选择不同的策略,最后执行策略类的方法。

总结


优点:算法可以自由切换,避免使用多重条件判断,扩展性良好

缺点:策略数量增多,所有的策略类向外暴露,违背迪米特法则

扩展

为了防止策略类扩展,可以使用枚举类处理

public enum Strategy{
    ADD("+"){
        public int exec(int a, int b){
            return a+b;
        }
    },
    SUB("-"){
        public int exec(int a, int b){
            return a-b;
        }
    };

    Strategy(String _value){
        this.value = _value;
    }

    public String getValue(){
        return this.value;
    }

    public abstract int exec(int a, int b);
}

 

策略模式

标签:

原文地址:http://www.cnblogs.com/xidongyu/p/5843982.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!