1、什么是策略模式?
策略模式将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现。也就是说将不变的部分抽象出来,定义算法族分别封装起来,客户端不会受算法改变的影响,对新增需求的弹性需求。
2、复合(组合):在类中增加一个私有的域,引用另一个已有的类的实例,通过调用实例的方法从而获得新的功能,这种设计被称为组合。例如:汽车的一个组合是车轮,Car类通过一个私有的域tires,这个域中有Tire<Array>数组,通过它引用Tire类中的实例。从而使用该类中的方法。比如说,A轮胎具有很强的抓地力适合雨雪天行驶,B轮胎适合晴朗天行驶,那么我们只需通过根换轮胎不同的实例就可以啦。
3、策略模式中的设计原则
1、找出应用中需要变化的部分,把他们独立出来,不要和那些不需要变化的代码混在一起。将不变的东西抽象成接口,变化的部分交给实现去做。2、面向接口编程,而不是面向实现编程。接口为我们提供契约。3、多用组合少用继承。
4、策略模式的实现
1、通过分离变化得出的策略接口Strategy
/*策略接口,实现鸭子的飞行行为*/
public interface FlyingStargety{
void performFly();
}
2、Strategy实现类
public class FlyNoWay implements FlyingStragety{
@Override
public void performFly() {
// TODO Auto-generated method stub
System.out.println("我不会飞行");
}
}
3、客户端程序”有一个“Strategy。(鸭子类持有一个飞行策略,通过飞行策略执行飞行行为)
private FlyingStragety flyingStragety;
public void setFlyingStragety(FlyingStragety flyingStragety) {
this.flyingStragety = flyingStragety;
}
public void fly(){
flyingStragety.performFly();
}
4、在客户程序中选择、组装正确的Strategy实现类(使得不同种类的鸭子具有相应的飞行行为)
public RedHeadDuck(){
super();
super.setFlyingStragety(new FlyWithWin());
}
package com.imooc.pattern.strategy;
public class BigYellow extends Duck{
public BigYellow(){
super();
super.setFlyingStragety(new FlyNoWay());
}
@Override
public void display() {
System.out.println("我身体恒大,全身黄黄");
}
}
package com.imooc.pattern.strategy;
/*
* 超类,所有的鸭子都要继承此类
* 抽象了鸭子的行为:显示和鸣叫
*/
public abstract class Duck {
/*
* 鸭子发出叫声
* 通过行为,由父类实现
*/
public void quack(){
System.out.println("叫声、、、嘎嘎嘎");
}
/*
* 显示鸭子的外观
* 鸭子的外观各不相同,声明为abstract,由子类实现
*/
public abstract void display();
private FlyingStragety flyingStragety;
public void setFlyingStragety(FlyingStragety flyingStragety) {
this.flyingStragety = flyingStragety;
}
public void fly(){
flyingStragety.performFly();
}
}
package com.imooc.pattern.strategy;
/*
* 策略接口,实现鸭子的飞行行为
*/
public interface FlyingStragety {
void performFly();
}
package com.imooc.pattern.strategy;
public class FlyNoWay implements FlyingStragety{
@Override
public void performFly() {
// TODO Auto-generated method stub
System.out.println("我不会飞行");
}
}
package com.imooc.pattern.strategy;
public class TestDuck {
public static void main(String[] args) {
System.out.println("测试鸭子程序");
System.out.println("**************");
Duck duck=null;
//duck=new MallardDuck();
//duck=new RedHeadDuck();
//duck=new RubberDuck();
//duck=new BigYellow();
duck=new SpaceDuck();
duck.display();
duck.quack();
duck.fly();
System.out.println("***************");
System.out.println("测试完毕");
}
}
package com.imooc.pattern.strategy;
/*
* 太空鸭子
*/
public class SpaceDuck extends Duck{
public SpaceDuck(){
super();
super.setFlyingStragety(new FlyWithRocket());
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("太空鸭子的头顶有防护罩");
}
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("通过无线电与我们通信");
}
}
package com.imooc.pattern.strategy;
public class FlyWithRocket implements FlyingStragety{
@Override
public void performFly() {
// TODO Auto-generated method stub
System.out.println("用火箭飞行");
}
}