定义:
定义一系列的算法,将每一个算法封装起来,并使它们之间可以相互替换,让算法具有可扩展性和对立性。
结构图:
- Context:环境类,算法的使用者。对外提供了算法使用的接口,并且持有一个抽象算法类的引用。当实际使用算法时,调用抽象算法类的接口,转发实际的算法调用。并且提供方法,让客户选择和设置内部的算法。
- Strategy:抽象策略类,定义了所有算法的统一接口,当有新的算法添加时可以采用继承或实现的方式来添加新的子类。
- ConcreteStrategy:具体算法子类,实现了抽象策略类中声明的算法,执行具体的算法业务。
Java SE 中的策略模式
在Java SE开发中,用户需要对容器对象Container中的成员对象如按钮、文本框等GUI控件进行布局(Layout),在程序运行期间由客户端动态决定一个Container对象如何布局,Java语言在JDK中提供了几种不同的布局方式,封装在不同的类中,如BorderLayout、FlowLayout、GridLayout、GridBagLayout和CardLayout等。Container类充当环境角色Context,而LayoutManager作为所有布局类的公共父类扮演了抽象策略角色,它给出所有具体布局类所需的接口,而具体策略类是LayoutManager的子类,也就是各种具体的布局类,它们封装了不同的布局方式。
优点:
- 支持开闭原则,对算法的修改和算法添加都十分方便,具有较强的可扩展性。
- 可以将抽象的代码移到抽象类当中,避免代码的重复。
- 算法可以进行复用,将单独的算法抽取出来,使得不同的环境类可以方便地复用这些策略。
缺点:
- 客户端必须知道所有的策略类,并决定使用哪一个策略。
- 无法再客户端使用多了策略,一次只能使用一个策略,不支持使用一个策略类完成部分功能后再使用另一个策略。
实例: