设计模式之策略模式

策略模式(Strategy) 是常用的一种设计模式,顾名思义,可以简单的理解为可以灵活的选择一种谋略(算法)达到某种目的。策略模式共有四个角色,分别为:Context上下文角色、抽象策略角色、具体策略角色、Client客户端,下文将详细介绍他们之家的关系

角色关系

代码实现

interface car {
    public int useTime();
}

class Bicycle implements car {
    String str = "运动,慢";

    public int useTime(start_site, end_site) {
        System.out.println(str);
        return 40;
    }
}

class Electrocar implements car {
    String str = "悠闲,快";

    public int useTime(start_site, end_site {
        System.out.println(str);
        return 25;
    }
}

class Automobile implements car {
    String str = "舒适,堵车";

    public int useTime(start_site, end_site) {
        System.out.println(str);
        return 30;
    }
}

class Context {
    private Car car;

    public void Context(Car car) {
        this.car = car;
    }
    public int getUseTime() {
        return car.useTime;
    }
}

class Client {
    public static void main(String[] args) {
        String start_site = "始发站";
        String end_site = "终点站";

        Context context = new Context(new Bicycle());
        return context.getUseTime(start_site, end_site);
    }
}

优缺点

优点

  • 策略模式符合开闭原则
  • 避免使用条件判断语句
  • 使用策略模式,可以减少暴露类的其他功能,安全性好

缺点

  • 客户端需要知道所有类,并实现该类(一般配合工厂模式使用)
  • 会增加很多策略类

对比其他设计模式

学过工厂模式的应该会有一个疑问,为什么不用工厂模式,用策略模式还要再使用工厂模式,以下我们对比一下和策略模式相似的模式的共同点和不同点

对比简单工厂模式

相同点

  • 结构很相似

不同点

  • 传入参数不同,简单工厂模式,传递的更倾向于类型(不知道返回的是什么类),策略模式传递的是已知的实例
  • 返回值不同,简单工厂模式返回的是实例,策略模式返回的是指定的方法
  • 工厂是创建型模式,它的作用就是创建对象。策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为

对比静态代理模式

相同点

  • 结构很相似,包括传递的参数类型
    不同点
  • 静态代理模式知道结果,比如找中介买房子,知道会买什么样的房子,及会买到房子。策略是计算结果,不知道内部如何处理
  • 静态代理模式,代理类和被代理类继承一个接口,实现同样的方法,策略类不同

个人能力有限,有不足的地方欢迎大家补充

原文地址:https://www.cnblogs.com/it-abel/p/14469608.html