一、介绍
策略模式,Strategy Pattern,定义了一系列封装的算法族,他们之间可以相互替换,此模式使得算法的变化独立于使用算法的客户端。
主要体现了以下几个设计原则:
1)把变化的代码从不变的代码中分离出来;
2)针对接口编程,定义了策略接口;
3)多用组合或聚合,客户端通过组合的方式使用策略。
类图设计如下:

二、实现
类图:

1)策略接口
/**
* @Note {飞行行为接口}
* @author giserDev
* @Date 2020-06-20 18:05:53
*/
public interface FlyBehavior {
void fly(); // 子类具体实现
}
package com.giser.designpattern.streategy;
/**
* @Note {叫声行为接口}
* @author giserDev
* @Date 2020-06-20 18:05:33
*/
public interface QuackBehavior {
void quack();
}
2)Context类
package com.giser.designpattern.streategy;
public abstract class Duck {
/**
* 组合相关的策略接口
*/
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
public abstract void display();//显示鸭子信息
public void quack() {
if (quackBehavior != null) {
quackBehavior.quack();
}
}
public void fly() {
if(flyBehavior != null) {
flyBehavior.fly();
}
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
3)策略实现类
package com.giser.designpattern.streategy;
public class GoodFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println(" 飞翔技术高超 ~~~");
}
}
package com.giser.designpattern.streategy;
public class NoFlyBehavior implements FlyBehavior{
@Override
public void fly() {
System.out.println(" 不会飞翔 ");
}
}
package com.giser.designpattern.streategy;
public class BadFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println(" 飞翔技术一般 ");
}
}
4)客户端
package com.giser.designpattern.streategy;
/**
* @Note {测试客户端}
* @author giserDev
* @Date 2020-06-20 18:08:23
*/
public class Client {
public static void main(String[] args) {
PekingDuck pekingDuck = new PekingDuck();
pekingDuck.fly();
//动态改变某个对象的行为, 北京鸭 不能飞
pekingDuck.setFlyBehavior(new NoFlyBehavior());
System.out.println("北京鸭的实际飞翔能力");
pekingDuck.fly();
}
}
三、说明
1)策略模式的关键在于确定变化部分和不变部分;
2)策略模式的核心思想是尽量使用组合或聚合;
3)策略模式体现了“对修改关闭,对扩展开放”的原则,客户端增加行为时,只需要添加一种策略即可,避免了使用多重条件语句,如if-else if-else结构;
4)提供了可以替换继承的方法:策略模式将算法封装在独立的策略类中,使得客户端可以独立于Context进行算法切换,易于扩展;
5)注意: 每添加一个策略,就需要增加一个类,当策略过多时,会导致类过多。
6)在JDK中,Arrays类的比较算法Comparator使用了策略模式。
963

被折叠的 条评论
为什么被折叠?



