设计模式之 策略模式

上一篇学习了工厂模式,那么策略模式和工厂模式有什么区别和关联呢,工厂是创建型模式,它的作用就是创建对象; 策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为。 还可以理解为工厂相当于黑盒子,策略相当于白盒子。

相关定义

策略模式,又叫算法簇模式, 它定义了不同的算法族,并且之间可以互相替换。策略模式体现了面向对象编程中多态的性质,将一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,对应类中用这个接口的对象实例来调用这个接口类的行为。

这样就可以避免硬编码(Hard Coding)中,一个类包含多个方法(每个方法对应一种计算模式),改动时需要修改封装算法类的源代码,更换查找算法等过程,维护较为困难。通过策略模式,可以灵活的管理不同的方法。

相关应用

在策略模式中包含了以下三个主体

  • 抽象策略类
    这个就是一个通用的算法接口类,这个公共接口主要应对可变的部分,Context 通过这个接口来调用某个算法。

  • 环境类
    就是 Context ,维护一个对抽象策略类对象的引用。

  • 具体策略类
    以抽象策略类接口实现某具体算法,也就是实现了抽象策略类的具体实体类。


我们举一个例子,现在有从A地到B地有三种方案,分别是火车、客车和飞机。以后可能添加游轮等方式,所以这个就是一个可变的情况,为了方便维护我们将旅行方案创建一个公共的接口

/**
 * 抽象策略类
 *
 * @since 2016
 */
public interface GoMethod {
    public void letsGo();
}

然后根据这个抽象的方式,我们来实现目前这三个现实的出行方式,通过实现抽象方式的接口我们创建了三个不同的出行方案 TrainMethod 、PlaneMethod 、 CarMethod

//以下是三个具体策略类

/**
 * @since 2016
 */
public class TrainMethod implements GoMethod{
    @Override
    public void letsGo() {
        System.out.println("we will go by train~ ");
    }
}

public class CarMethod implements GoMethod {
    @Override
    public void letsGo() {
        System.out.println("we will go by car~ ");
    }
}

/**
 * @since 2016
 */
public class PlaneMethod implements GoMethod {
    @Override
    public void letsGo() {
        System.out.println("we will go by plane~ ");
    }
}

最后我们通过一个总的环境类 MethodContext 来维护这几个策略

/**
 * Context环境类来维护这几个策略
 *
 * @since 2016
 */
public class MethodContext {

    private GoMethod method;

    public MethodContext(GoMethod method) {
        this.method = method;
    }

    public void setMethod(GoMethod method) {
        this.method = method;
    }

    public void letsGo() {
        this.method.letsGo();
    }
}

然后在实际情况中我们就可以使用这个策略模式了,假设我们用户选择乘车的方式从A 到 B,我们就可以这样选择

/**
 * 用户选择乘车的方式出行
 *
 * @since 2016
 */
public class UserClass {

    private MethodContext context;

    public static void main(String[] args) {
        new UserClass().choice();
    }

    public void choice() {
        context = new MethodContext(new CarMethod());
        context.letsGo();
    }
}

这样,使用策略模式就完成了,这种方式对后期的维护工作比较方便,策略模式本质上是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是 准备一组算法,并将每一个算法封装起来,使得它们可以互换使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值