java设计模式-策略模式

定义:定义一系列的算法,将它们封装起来,且这些算法具有一定的相似性,通过接口访问它们时可以相互替换。
理解:就是说对于不同的策略,有不同的具体实现方法,这些具体实现方法继承自同一个接口,业务逻辑层通过接口访问具体实现方法。
几种类型的类
1.抽象策略类(具体实现的抽象接口层)
2.具体策略类(实现抽象策略类,具体实现层)
3.场景角色类(关联抽象策略类,业务逻辑层)
具体应用
1.抽象策略接口

package com.java.celv;
/** 
 * @author wangpei 
 * @version 创建时间:2017年5月7日 下午3:11:40 
 * 抽象策略角色
 */
public interface Strategy {
    public void doThing();
}

2.具体策略类1

package com.java.celv;

/**
 * @author wangpei
 * @version 创建时间:2017年5月7日 下午3:34:19 鸡类
 */
public class ConcreteStrategy2 implements Strategy {

    @Override
    public void doThing() {
        System.out.println("我可以打鸣");

    }

}

3.具体策略类2

package com.java.celv;
/** 
 * @author wangpei 
 * @version 创建时间:2017年5月7日 下午3:30:21 
 * 猴子类,具体策略类
 */
public class ConcreteStrategy1 implements Strategy{

    @Override
    public void doThing() {
        System.out.println("我可以爬树");

    }




}

4.业务逻辑类

package com.java.celv;
/** 
 * @author wangpei 
 * @version 创建时间:2017年5月7日 下午3:35:14 
 * 场景角色类,对抽象策略类的调用
 */
public class Context {
    public Strategy st;
    public Context(Strategy st){
        this.st=st;

    }
    public void execute(){
        st.doThing();
    }
    public static void main(String[] args) {
        ConcreteStrategy1 c1=new ConcreteStrategy1();
        Context x1=new Context(c1);
        x1.execute();
        ConcreteStrategy2 c2=new ConcreteStrategy2();
        Context x2=new Context(c2);
        x2.execute();
    }

}

不用策略模式时,通过if-else

package com.java.celv;
/** 
 * @author wangpei 
 * @version 创建时间:2017年5月7日 下午3:41:18 
 * 不用策略模式的实现
 */
public class Wucelv {
    public void execute(){
        if("传入的类型".equals("鸡类型"))
            System.out.println("我可以打鸣");
        else if("传入的类型".equals("猴子类型类型"))
            System.out.println("我可以爬树");
        else
            System.out.println("未有改类型");

    }

    public static void main(String[] args) {

    }

}

从上面的代码很容易看出,抽象接口类实现对底层具体实现类的底层封装,context业务逻辑层通过接口调用其具体方法。
优点
1.各策略类间可以自由切换
2.降低各类间的耦合度,避免使用太多的if-else -if连接
3.易于扩展,当增加一种策略时,只需实现继承抽象接口的策略类即可,代码修改量少。
缺点
1.随着策略的增加,需要维护过多的策略类,浪费资源。
2.客户端必知道各个策略类具体功能,然后才能应对不同的策略调用不同的策略类。
策略模式在java中的应用
1.Arrays.sort(T[], Comparator < ? super T > c)
具体看:
http://blog.csdn.net/wisgood/article/details/16541013
对于不同的策略,其实现Comparator接口对应的compare方法不同

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值