策略模式:定义了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。这解释简直跟没说一样,谁看得懂。。
其实就是把容易改动、变化的部分单独拿出来封装,使得这部分改变不影响其它代码
先理解什么事多态
,
概念:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单的说:就是用基类的引用指向子类的对象。
其实就是接口里一个方法,不同对象来调,产生不同的形态,那是因为不同子类都重写了这个方法,子类对象向上转型为接口类型的对象调用这个方法其实执行的是子类的同名方法。
现有一个实例,实现不同的鸭子具有不同的飞行方式,也可能一个鸭子具有不同飞行方式
1.有多种鸭子,肯定要把鸭子抽象出来一个公共父类Duck
2.飞行方式有很多种,也要抽象出来一个借口,不同的飞行方式作为子类去实现飞行接口
3.把飞行和鸭子组合到一起,把接口类 对象作为变量放到Duck类去掉接口类方法
package test;
public class StrategyPattern {
public static void main(String args[]){
Duck duck = new MallardDuck();//我感觉此处向上转型的目的就是为了去执行MallardDuck的构造函数
//给fly对象赋子类对象,最后能调子类重写的方法
duck.performFly();
duck.setBehavior(new FlyNoWay());
duck.performFly();
}
}
class Duck{//鸭子父类
FlyBehavior fly ; //定义接口对象
QuackBehavior quack;
public Duck(){}//无参构造方法
public void performFly(){//封装了飞的方法
fly.fly();//调用父类FlyBehavior里的fly方法,其实掉了子类FlyWithWings覆盖的fly方法
}
public void setBehavior(FlyBehavior fly){//设置行为 其实就是决定给当前接口对象赋那个对象
this.fly = fly;
}
}
class MallardDuck extends Duck{
public MallardDuck(){//构造函数
fly = new FlyWithWings();//定义了子类对象赋给父类对象 动态创建
}
}
class ModelDuck extends Duck{
public ModelDuck(){//构造函数
fly = new FlyNoWay();//相当于对象创建时(执行构造函数)声明我要执行哪个子类的fly方法
}
}
class FlyWithWings implements FlyBehavior{
public void fly(){//重写父类方法
System.out.println(" i am a flying Duck with wings!");
}
}
class FlyNoWay implements FlyBehavior{//实现飞行接口
public void fly(){ //重写fly方法
System.out.println("i can not fly at all");
}
}
public interface FlyBehavior {//飞行接口
public void fly();
}
运行结果:
i am a flying Duck with wings!
i can not fly at all