Java程序员从笨鸟到菜鸟(三十四)23种设计模式之策略模式

策略模式

策略模式是种倾向于行为的模式

以工厂模式和策略模式的比较来讲解策略模式

汽车制造为背景

工厂模式:假设有Audi的公司生产汽车,它掌握一项核心的技术就是生产汽车,另一方面,它生产的汽车是有不同型号的,并且在不同的生产线上进行组装。当客户通过销售部门进行预定后,Audi公司将在指定的生产线上为客户生产出它所需要的汽车

策略模式:唯一的区别是工厂模式实例化一个产品的操作是在服务端来做的,换句话说客户端传达给服务端的只是某种标识,服务端根据该标识实例化一个对象。而策略模式的客户端传达给服务端的是一个实例,服务端只是将该实例拿过去在服务端的环境里执行该实例的方法

使用一个买车的例子来讲解两种模式

一个对汽车不甚了解的人去买车,他在那一比划,说要什么什么样的,销售部门根据他的这个“比划”来形成一份订单,这就是工厂模式下的工作方式;而策略模式下那个顾客就是个行家,他自己给出了订单的详细信息,销售部门只是转了一下手就交给生产部门去做了.通过两相对比,我们不难发现,采用工厂模式必须提供足够灵活的销售部门,如果用户有了新的需求,销售部门必须马上意识到这样才可以做出合适的订单。所以一款新车出来了,生产部门和销售部门都需要更新,对顾客来说也需要更新对新车的描述所以需要改动的地方有三处;而策略模式中的销售部门工作比较固定,它只负责接受订单并执行特定的几个操作。当一款新车出来时,只需要对服务端的生产部门和客户端的代码进行更新,而不需要更新销售部门的代码

两者区别
在于实例化一个对象的位置不同,对工厂模式而言,实例化对象是放在服务端的,即放在了工厂类里面;而策略模式实例化对象的操作在客户端,服务端的“销售部门”只负责传递该对象,并在服务端的环境里执行特定的操作

  • 用途不一样
    • 工厂是创建型模式,作用是创建对象
    • 策略是行为型模式,作用是一个对象在许多行为中选择一种行为
  • 关注点不一样
    • 工厂关注对象的创建
    • 策略关注行为的封装
  • 解决不同的问题
    • 工厂模式是创建型设计模式,它接受指令,创建出符合要求的实例,它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等
    • 策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户
  • 工厂相当于黑盒(功能),策略相当于白盒(结构)

例子说明:
工厂模式:有一天你决定去吃KFC,一看菜单,哦,种类很多呀,你就点了个老北京,过了二十分钟,你的老北京就来了就可以吃到了。但这个老北京是怎么做的,到底面粉放了多少,鸡肉放了多少,佐料放了多少,有多少到工序,你是不需要管的,你需要的是一个美味老北京。

所以上面的老北京是创建型模式,有了工厂,有了具体的抽象方法。只要继承相应的流程。

策略模式:同样还是在KFC,你要一个老北京,老板说想吃自己去做吧。原料有鸡肉、面粉、佐料。工序有1、2、3工序,你自己去做吧。然后你就需要自己按照策略去做,到底放多少培根,放多少面粉,放多少佐料,这都你自己来决定,工序1、2、3,你是怎么实现的,都你自己决定。最后你得到了老北京。

代码实现
产品类

// 抽象产品
public abstract class AudiCar {
    private String name;

    public abstract void makeCar();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

// 具体产品
class AudiA6 extends AudiCar {
    public void makeCar() {
        System.out.println(this.getName() + "...go");
    }
}
class AudiA4 extends AudiCar {
    public void makeCar() {
        System.out.println(this.getName() + "...go");
    }
}

销售部门—服务端

public class CarContext {
    AudiCar audiCar = null;

    public CarContext(AudiCar audiCar) {
        this.audiCar = audiCar;
    }
    public void orderCar() {
        this.audiCar.makeCar();
    }
}

客户端

public class Customer {
    public static void main(String[] args) {
        AudiCar car = new AudiA6();
        car.setName("A6");

        CarContext context = new CarContext(car);
        context.orderCar();
    }
}

运行结果:

A6...go

Process finished with exit code 0

策略模式的优缺点

优点

  • 策略类之间可以自由切换,由于策略类实现自同一个抽象,所以他们之间可以自由切换
  • 易于扩展,增加一个策略非常容易,基本上可以在不改变原有代码的基础上进行扩展
  • 避免使用多重条件,如果不使用策略模式,对于所有的算法,必须使用条件语句进行连接,通过条件判断来决定使用哪一种算法,在上一篇文章中我们已经提到,使用多重条件判断是非常不容易维护的

缺点

  • 维护带来额外的开销
  • 必须对客户端(调用者)暴露所有的策略类,因为使用哪种策略类是由客户端决定的,客户端应该知道有什么策略,并且了解各种策略之间的区别,否则,后果很严重

    原文传送门:https://www.cnblogs.com/zhangchenliang/p/3700820.html

猜你喜欢

转载自blog.csdn.net/u013090299/article/details/80737172
今日推荐