设计模式之策略模式(Strategy)

定义

策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

应用场景:

1、当实现某一个功能存在多个算法或者策略时,可以根据环境或者条件的不同选择不同的算法或者策略来实现某个功能
2、一个系统需要动态地在几种算法中选择一种时,可以将每个算法封装到策略类中
3、一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可以将每个条件分支移入各自策略类中来代替这些
条件语句
4、系统中各个算法策略彼此独立,并且要求对客户端隐藏具体算法的实现细节
5、系统要求使用算法的客户不应知道操作的数据,可以使用策略模式隐藏与算法有关的数据结构
6、多个类的区别只是表现行为的不同,可以使用策略模式在系统运行时选择需要具体执行的行为
7、比如数据排序策略的冒泡排序,选择排序,插入排序和二叉树排序等

策略模式中的角色:

1、环境Context: 持有一个抽象策略Strategy的引用
2、抽象策略Strategy: 抽象角色.给出所有具体策略类所需的接口,通常是由一个接口或者抽象类实现
3、具体策略ConcreteStrategy: 具体策略类. 封装了具体的算法

策略模式的优缺点

优点:
1、策略模式符合开闭原则。
2、避免使用多重条件转移语句,如if…else…语句、switch 语句
3、使用策略模式可以提高算法的保密性和安全性。
缺点:
1、客户端必须知道所有的策略,并且自行决定使用哪一个策略类。
2、代码中会产生非常多策略类,增加维护难度。

案例:选自《设计模式之禅》
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题。搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是诸葛亮给的,妙计是放置在锦囊里,俗称就是锦囊妙计,那赵云就是一个干活的人,从锦囊中取出计,执行,然后获胜
UML类图 在这里插入图片描述
JAVA代码实现
定义策略接口类:

/**
* 策略接口
*/
public interface StrategyInterface {
    /**
     * 对应三个锦囊妙计,每个对应了一个算法
     */
    public void operate();
}    

编写三个实现类,对应三个锦囊
1、锦囊一:找乔国老帮忙,使孙权不能杀刘备

/**
* 锦囊一:找乔国老帮忙,使孙权不能杀刘备
*/
public class BackDoor implements StrategyInterface {
    @Override
    public void operate() {
        System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
    }
}

2、锦囊二:求吴国太开个绿灯

/**
* 锦囊二:求吴国太开个绿灯
*/
public class GivenGreenLight implements StrategyInterface {
    @Override
    public void operate() {
        System.out.println("求吴国太开个绿灯,放行!");
    }
}

3、锦囊三:孙夫人断后,挡住追兵

/**
* 锦囊三:孙夫人断后,挡住追兵
*/
public class BlockEnemy implements StrategyInterface {
    @Override
    public void operate() {
        System.out.println("孙夫人断后,挡住追兵");
    }
}

计谋有了,该编写锦囊类了,用来存放计谋

public class Context {

    //构造函数,你要使用那个妙计
    private StrategyInterface straegy;
    public Context(StrategyInterface strategy){
        this.straegy = strategy;
    }

    //使用计谋
    public void operate(){
        this.straegy.operate();
    }
}

最后该赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计,如下

public class ZhaoYun {
    public static void main(String[] args) {
        System.out.println("-----------赵云护送刘备开始离开东吴!start-------------");
        Context context;
        System.out.println("-----------刚刚到吴国的时候拆第一个-------------");
        context = new Context(new BackDoor()); //拿到妙计
        context.operate(); //拆开执行
        System.out.println("\n\n\n");

        //刘备乐不思蜀了,拆第二个了
        System.out.println("-----------刘备乐不思蜀了,拆第二个了-------------");
        context = new Context(new GivenGreenLight());
        context.operate(); //执行了第二个锦囊了
        System.out.println("\n\n\n");

        //孙权的小兵追了,咋办?拆第三个
        System.out.println("-----------孙权的小兵追了,咋办?拆第三个-------------");
        context = new Context(new BlockEnemy());
        context.operate(); //孙夫人退兵
        System.out.println("\n\n\n");
        System.out.println("-----------赵云护送刘备已经离开东吴!end-------------");
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值