策略模式

一、模式名

策略, Strategy

二、解决的问题

策略,这个词中国人应该不陌生,从古代的孙子兵法,到现代的毛主席军事思想,无不充斥着策略。策略可以看做是解决问题的一种思想、办法,比如古代攻城略地,一般会使用强攻、水淹、火烧、离间、围城打援、心理战等,这些都是攻城的策略,当然这些策略有好有坏。在软件设计中,也存在很多策略,即一个问题有多种解决方法,每种解决方法可能针对不同的问题,或者每种解决方法有不同的特性,比如性能等。

策略模式一般会定义一个策略接口或抽象类,用于定义解决问题的策略方法,具体的策略方法交给子类去实现。客户端可以使用不同的策略完成对应的任务。

策略模式的优点:

1. 策略可以完整替换,当需要修改策略时,只需切换另一个已有策略,或者新增一个策略子类,再完成切换。

三、解决方案

策略模式的UML图如下所示。

clipboard

代码如下:

public class StrategyTest {
    public static void main(String[] args) {
        AttackStrategy attackStrategy= new WeichengdayuanStrategy();
        Commander commander = new Commander(attackStrategy);
        commander.battle();
    }
}

class Commander {
    private AttackStrategy strategy;

    public Commander(AttackStrategy strategy) {
        this.strategy = strategy;
    }

    public void battle() {
        System.out.println("准备作战");

        strategy.attack();

        System.out.println("作战完成");
    }
}

interface AttackStrategy {
    void attack();
}

class WeichengdayuanStrategy implements AttackStrategy {
    @Override
    public void attack() {
        System.out.println("围城打援");
    }
}

class QianggongStrategy implements AttackStrategy {
    @Override
    public void attack() {
        System.out.println("强攻");
    }
}

策略模式和工厂模式结合实践,代码如下:

// 新建一个策略简单工厂
class AttackStrategyFactory {
    public AttackStrategy create(int type) {
        if (type == 1) {
            return new WeichengdayuanStrategy();
        } else {
            return new QianggongStrategy();
        }
    }
}

public class StrategyTest {
    public static void main(String[] args) {
        AttackStrategy attackStrategy = new AttackStrategyFactory().create(1);
        Commander commander = new Commander(attackStrategy);
        commander.battle();
    }
}

常见应用场景:

1. 针对不同问题有不同解决办法时,可以考虑使用策略模式

posted @ 2019-06-22 16:20  锢浪熟阳  阅读(324)  评论(0编辑  收藏  举报