什么是策略模式?
策略模式是有多个选择,每个选择都是一种策略,就像面向对象的一个特性:多态。就拿出行来说,比如我想从深圳去到北京,有多种出行方式供我选择 :飞机、高铁、汽车;每种选择方式都有自己的特点;
策略模式的原介绍是:定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换 ,在代码中更多的使用来表示算法的策略,比如我们GC 垃圾回收算法中就用到了策略模式
首先,算法是一个接口,所有的策略都是算法的实现类,实现不同的功能,这中间还有一个上下文 Context;Context是上下文角色,也叫Context封装角色,起承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化,用类图来表示则是这样的
在上下文中一个属性为 算法的接口(也可以是抽象类),这个接口有多种实现,需要哪种实现则直接调用其实例对象即可,
策略模式的优点
- 算法可以自由切换
- 避免使用多重条件判断(如果不用策略模式我们可能会使用多重条件语句,不利于维护)
- 扩展性良好,增加一个策略只需实现接口即可
缺点
- 策略类数量会增多,每个策略都是一个类,复用的可能性很小
- 所有的策略类都需要对外暴露
使用场景
- 多个类只有算法或行为上稍有不同的场景(这一点和模板方法模式类似)
- 算法需要自由切换的场景
JDK哪里用到了策略模式
JDK1.5之后新出了一个叫做并发包的东东,并发包里面就包含了线程池这个玩意,面试官经常问到的一个问题:“线程池一共有几个参数?”,答案是一共有7个参数,其中,最后一个参数就是拒绝策略,指的是线程池满了之后,如果再来一个线程要以怎样的方式来处理这个些线程,这个拒绝策略用的就是策略模式;
代码实现
- package com.designPatterm.strategy;
-
- /**
- * 设计模式-- 策略模式
- */
- public class StrategyTest {
- public static void main(String[] args) {
- //引用计数算法
- ContextGc a = new ContextGc(new GcA());
- a.show();
- // 标记压缩算法
- ContextGc b = new ContextGc(new GcB());
- b.show();
- //标记清除算法
- ContextGc c = new ContextGc(new GcC());
- c.show();
- }
- }
-
- // 垃圾回收机制算法接口
- interface GcStrategy{
- //算法方法
- void algorithm();
- }
-
- //引用计数算法
- class GcA implements GcStrategy{
- @Override
- public void algorithm() {
- System.out.println("引用计数算法");
- }
- }
- //标记压缩算法
- class GcB implements GcStrategy{
- @Override
- public void algorithm() {
- System.out.println("标记压缩算法");
- }
- }
- // 标记清除算法
- class GcC implements GcStrategy{
- @Override
- public void algorithm() {
- System.out.println("标记清除算法");
- }
- }
-
- //上下文,承上启下的作用
- class ContextGc{
-
- private GcStrategy strategy;
- public ContextGc( GcStrategy strategy){
- this.strategy = strategy;
- }
- // 使用算法
- public void show(){
- strategy.algorithm();
- }
- }