设计模式之禅学习笔记--策略模式

来源:互联网 发布:禁止软件安装选项 编辑:程序博客网 时间:2024/05/24 02:16

一、定义

定义一组算法,将每个算法都封装起来,并且使它们之间可以互换(实现相同的接口)。


二、通用类图


策略模式使用的就是面向对象的继承和多态机制,非常容易理解和掌握。

1:Context 封装角色

它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接封装可能存在的变化。

2:Strategy 抽象策略角色

策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。

3:ConcreteStrategy 具体策略角色

实现抽象策略中的操作,该类含有具体的算法。

三、通用代码

1:Strategy 抽象策略角色

public interface Strategy {//策略模式的运算法则public void doSomething();}

2:ConcreteStrategy 具体策略角色

public class ConcreteStrategy1 implements Strategy {@Overridepublic void doSomething() {System.out.println("ConcreteStrategy1");}}

public class ConcreteStrategy2 implements Strategy {@Overridepublic void doSomething() {System.out.println("ConcreteStrategy2");}}


3:Context 封装对象

public class Context {//抽象策略private Strategy strategy = null;//构造函数设置具体策略public Context(Strategy strategy) {this.strategy = strategy;}//封装后的策略方法public void doAnything() {this.strategy.doSomething();}}


4:Client 场景类

public class Client {public static void main(String[] args) {//声明一个具体的策略Strategy strategy = new ConcreteStrategy1();//声明封装对象Context context = new Context(strategy);//执行封装后的方法context.doAnything();}}

四、优缺点

1:算法可以自由切换。这是策略模式本身定义的,只要实现抽象策略,它就成为策略家族的一个成员,通过封装角色对其惊醒封装,拨正对外提供“可自由切换”的策略。

2:避免使用多重条件判断。

3:拓展性良好。

4:策略类数量增多。每个策略都是一个类,复用的可能性很小,类数量增多。

5:所有的策略类都需要对外暴露。


五、注意点

1:策略模式的重点是封装角色,它借用了代理模式的思路。它与代理模式的区别是:策略模式的封装对象和被封装的策略类不是实现同一个接口。

2:如果系统中的一个策略家族的具体策略数量超过4个,则需要考虑使用混合模式,解决策略类膨胀和对外暴露的问题。

0 0
原创粉丝点击