(本文中一些例子和定义均摘自《Head First 设计模式》)
“策略模式: 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户”
其实也就是把相似,类似的行为封装,并且使得它们之间可以互换.
举例, 鸭子的叫声有阿阿叫,也有呱呱叫.
我们首先把鸭子与鸭子叫 这两部分分开, 也就是把使用算法的客户和算法分开.
第二步,建立策略类(抽象策略方法), 通常使用接口或者是抽象类.在此例中,我们 建立鸭子叫的接口
public
interface
QuackBehavior
...
{
public void quack();
}
第三步,对每种不同的叫声Quack,Squeak进行实现
public
class
Quack
implements
QuackBehavior
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void quack() ...{
System.out.println("aa quake!!!");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
Squeak
implements
QuackBehavior
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void quack() ...{
System.out.println("Squeak!!");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
第四步,在基类中持有对策略类的引用
public
abstract
class
Duck
...
{
QuackBehavior quackBehavior;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public Duck() ...{
}
public abstract void display();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void performQuack() ...{
quackBehavior.quack();
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void swim() ...{
System.out.println("all ducks can swim!");
}
//可以改变叫声
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void setQuackBehavior(QuackBehavior qb) ...{
this.quackBehavior = qb;
}
}
第五步,具体使用
public
class
MiniDuckSimulator
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public static void main(String[] args) ...{
Duck mallard = new MallardDuck();
mallard.display();
mallard.setQuackBehavior(new Quack());
mallard.performQuack();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
优点: 1.对算法独立的封装,不会由于使用者的变化,而对具体的算法也进行变化.实现算法代码的复用.
2. 可以对算法实行统一有效的管理
3. 用户可以方便的选择自己需要的算法
缺点:1. 用户需要知道所有的算法才能灵活运用
2. 策略类可能会非常的多