在我们生活中 一直会存在选择 在每一次你做出选择的时候 也就代表你使用了一种Strategy
就像你出门出去玩一样 到达目的地 假如是上海到杭州
你可以选择坐飞机,坐火车,开车等等方式到达目的地 当然你也可以选择走路到达
这样选择的不同行为就相当于是一种策略
一般我们会把共同的属性和行为放在超类上面,但是这个时候就会产生一个问题,
当子类行为大部分一致是,但有少部分不一致。例如定义一个Person
这个时候我们有男人和女人两个子类去继承Person ,但是男人和女人这个时候有分歧了
男的晚睡十分钟,女的想早睡十分钟 ,这就出现了两种行为。
我们就可以把sleep这个行为提取出来实现一个行为接口
然后增加这个行为的策略例如
早睡十分钟
和晚睡十分钟
然后我们开始修改Person超类
把这种行为接口放到Person超类中 提供一个可以动态设置策略的方法接口
我们之后的子类就可以动态的实现睡觉的这个行为了
当然 到了这个时候我们可能有人会问 我直接在子类中重写超类中的sleep方法不是也一样的吗
这是因为我们举例的子类也就是只有两个 当子类多了 假如有100个 不同的person子类
AfterSleep 50个 FirstSleep 50个 我们这个时候不要早睡10分钟 都要早睡100分钟 有了策略模式的话
我们只需要去进行修改我们的具体策略就可以了 不用去改变子类和超类中的方法
策略模式的三种角色
- 策略(Strategy):策略是一个接口,该接口定义算法标识。
- 具体策略(ConcreteStrategy):具体策略是实现策略接口的类。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体算法。
- 上下文(Context):上下文是依赖于策略接口的类,即上下文包含有策略声明的变量。上下文中提供了一个方法,该方法委托策略变量调用具体策略所实现的策略接口中的方法。