设计模式之----策略模式
- 什么是策略模式
策略模式将程序中的可变部分,抽象成一个算法接口,然后在这个接口下封装一系列算法。
策略模式具有可扩展性,如果有新的需求来了,就增加新的算法就可以(更多详细可以在慕课网上看到)
比如原来有只“鸭子“ 但是它不会飞,要想给它增加一个飞行的功能,具体的实现步骤
1)定义一个飞行接口(算法接口)
2)实现一种飞行方式(具体的实现算法)
3)在“鸭子”的父类,增加一个飞行的属性,并给这个属性set方法。应用这个属性(依赖于抽象而不是依赖于具体)
4)“鸭子”具体实现类,在构造器中set 飞行的具体实现类。(算法的选择)
下面是简单的代码实现;
鸭子的父类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package duck;
import fly.Fly;
/**
*
* @author zheng.zhong
*这是一个鸭子的基本属性
*/
public abstract class Duck {
private Fly fly;
/**
* 外观
*/
public abstract void look();
/**
*
*/
public abstract void jiao();
public void fly(){
fly.fly();
}
public void setFly(Fly fly) {
this.fly = fly;
}
}
飞行的接口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package fly;
public interface Fly {
/**
* 具体的飞行方式
*/
public void fly();
}
飞行的具体实现
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package fly;
public class FlyBywind implements Fly {
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("用翅膀飞行");
}
}
鸭子的具体实现
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package duck;
import fly.FlyBywind;
public class YelloDuck extends Duck {
YelloDuck(){
super();
super.setFly(new FlyBywind());
}
@Override
public void look() {
System.out.println("大黄鸭");
}
@Override
public void jiao() {
// TODO Auto-generated method stub
System.out.println("--呱呱呱--");
}
}
测试代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package duck;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Duck duck=null;
duck=new YelloDuck();
duck.look();
duck.jiao();
duck.fly();
}
}
测试结果
大黄鸭
--呱呱呱--
用翅膀飞行
看到结果,我们已经实现了赋予鸭子的飞行能力。并且这能力能赋予其他鸭子,代码的复用和维护性增强。这个就是策略模式。
学习的时间不一定要特定安排