Java 设计模式(九) Strategy(策略)模式及Spring引申

Strategy

基本概念

策略模式(Strategy Pattern):

  • 定义一组算法,将每个算法都封装起来,并且他们之间可以互换。
  • 使用面向对象的继承多态机制实现
Strategy中的角色:
  • Context封装角色:
    它叫做上下文角色,起承上启下的封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化
  • Strategy抽象策略角色:
    策略,算法家族的抽象,通常为接口,定义每个策略或算法的必须具有的算法和属性。
  • Concrete Strategy具体策略角色:
    实现抽象策略中的操作,包含具体的算法

理解Strategy模式

  • 优点:
    • 算法可以自由切换,因为具体类的实现不会影响接口的使用,在接口不修改的前提下,具体类可以自由切换(多态)
    • 避免多重条件判断,由其他模块决定采取何种策略,策略家族只提供接口
    • 拓展性好,可以直接继承共同的接口实现多态来拓展,不需要修改已经存在的类
  • 缺点:
    • 策略类数量庞大(可以采用装饰模式来防止类数量的爆炸)
    • 所有策略类都要对外暴露
Strategy的特性决定它的应用场景是在算法需要自由切换的需要屏蔽算法规则的场景当中。

例讲Strategy

又要根据场景写代码了,感觉策略模式的适用场景太多了….而且往往我们在使用中有时候都不会意识到它的存在…那么废话到此为止
比如我们作为一个Editor,要对一段代码上色让它高亮,那么我们就抽象出画笔这个角色,然后开始我们的涂色之旅…

/**
 * Created by liulin on 16-5-6.
 */

interface Strategy{
    void operate();
}

class RedPaint implements Strategy{

    @Override
    public void operate() {
        System.out.println("paint the code to red!");
    }
}

class BluePaint implements Strategy{


    @Override
    public void operate() {
        System.out.println("Paint the code to blue!");
    }
}

class Context{
    private Strategy strategy;

    public Context( Strategy strategy ){
        this.strategy = strategy;
    }

    public void operate ( ){
        strategy.operate();
    }
}

public class StrategyTest {
    public static void main ( String [] args ) {
        Context context = new Context(new BluePaint());
        context.operate();
        context = new Context ( new RedPaint());
        context.operate();
    }
}

输出结果如下:
这里写图片描述

Spring引申

在Spring采取动态代理时有JDK和CGLIB两种代理方式,就是采用策略模式实现的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值