Java 设计模式之策略模式(java策略模式例子)

资讯 2年前 (2022) 千度导航
35 0 0

定义:

该模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法的变化不会影响使用算法的用户。

策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现方式分割开来,并委派给不同的对象对这些算法进行管理。

通俗理解:

在现实生活中经常遇到某种目标存在多种策略可供选择的情况。

例如:出行可以选择乘坐火车、汽车、私家车、自行车等。

优点:

1、多重条件语句不易维护,使用策略模式可以避免使用多重条件语句,如if...else 语句、switch...case语句。

2、使用恰当的继承,可以把公共代码转移到父类里面,避免重复代码。

3、策略模式可以提供相同的行为不同的实现,客户可以根据不同时间或空间要求选择不同的。

4、策略模式完美支持开闭原则,可以在不修改原代码的情况下,灵活增加算法。

5、策略模式实现了对算法的使用和实现,二者分离。

缺点:

1、使用者必须了解所有算法的区别,以便选择恰当的算法类。

2、会造成很多策略类,增加维护难度。

策略模式结构:

1、抽象策略类:定义一个公共接口,各种不同算法以不同的方式实现这个接口,环境角色使用这个接口调用不同算法,一般使用接口或者抽象类实现。

2、具体策略类:实现了抽象策略定义的接口,提供具体的算法实现。

3、环境类: 持有一个策略类的引用,最终给客户端调用。

代码实现场景:

刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题。

先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜。

上代码:

/**
 * 首先定一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口
 */
public interface IStrategy {

    //每个锦囊妙计都是一个可执行的算法
    public void operate();
}
/**
 * 妙计有了,需要把妙计放到锦囊里面
 */
public class Context {

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

    // 开始使用锦囊
    public void operate() {
        this.iStrategy.operate();
    }

}
public class BackDoor implements IStrategy {

    /**
     * 妙计一 : 找乔国老帮忙,使孙权不能杀刘备
     */
    @Override
    public void operate() {
        System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
    }
}
/**
 * 妙计二:求吴国太开个绿灯
 */
public class GivenGreenLight implements IStrategy {
    @Override
    public void operate() {
        System.out.println("求吴国太开个绿灯,放行!");
    }
}
/**
 * 妙计三:孙夫人断后,挡住追兵
 */
public class BlockEnemy implements IStrategy {

    @Override
    public void operate() {
        System.out.println("孙夫人断后,挡住追兵");
    }
}
public class ZhaoYun {

    /**
     * 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
     * @param args
     */
    public static void main(String[] args) {
        Context context;

        System.out.println("-----------刚刚到吴国的时候拆第一个-------------");
        context = new Context(new BackDoor());
        context.operate();
        System.out.println("\n\n");


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



        System.out.println("-----------孙权的小兵追了,咋办?拆第三个 -------------");
        context = new Context(new BlockEnemy());
        context.operate();
        System.out.println("\n\n");
    }
}

注:本文创作思路源于《设计模式之禅》

版权声明:千度导航 发表于 2022年7月15日 23:13。
转载请注明:Java 设计模式之策略模式(java策略模式例子) | 千度百科

相关文章