1:策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计原则:① :找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
②:针对接口编程,而不是针对实现编程。
③:多用组合,少用继承。
针对接口编程,关键就在于多态,利用多态,程序可以针对超类型编程,执行时会根据实际状况执行到真正的行为,不会被绑死在超类型的行为上。
将程序中变化的部分定义成一个接口,每种不同的变化都作为接口的具体实现子类。如果某一个类需要这种变化的模块,就可将其接口作为此类的一个属性,从而达到使用变化类的目的。这种设计,可以很方便的对程序进行更新,因为一开始就把变化的部分提取出来了。
例如要设计一个Duck类,每个鸭子的外表Display()是不同的,但是都有,所以设计成抽象方法,每个鸭子都会游泳Swim()。所以在超类中就实现。对于飞行和叫的行为,每种鸭子各不一样,比如有的会飞,有的不会飞,有的会叫,有的不会叫,叫声又各不相同,所以将鸭子的飞行和叫的行为设计为接口。对于每种不同的飞行或者叫设计为具体的实现子类,利用组合的方式添加到鸭子中。
public abstract class Duck {
FlyBehavior flyBehavior;//组合
QuarkBehavior quarkBehavior;
public abstract void display();
public void swim(){
System.out.println("I can swim");
}
public void performQuark(){
quarkBehavior.quark();
}//针对接口编程
public void performFly(){
flyBehavior.fly();
}
public void setFlyBehavior(FlyBehavior fb){
flyBehavior=fb;
}//可以动态改变
public void setQuarkBehavior(QuarkBehavior qb){
quarkBehavior=qb;
}
}
public interface FlyBehavior {
public abstract void fly();
}
public interface QuarkBehavior {
public abstract void quark();
}
public class Quark implements QuarkBehavior{
public void quark(){
System.out.println("I can quark.");
}
}
public class MuteQuark implements QuarkBehavior{
public void quark(){
System.out.println("I can not quark.");
}
}
public class FlyWithWings implements FlyBehavior{
public void fly(){
System.out.println("I can fly with wings");
}
}
public class FlyWithNoWings implements FlyBehavior{
public void fly(){
System.out.println("I can not fly with wings");
}
}
public class RedHeadDuck extends Duck{
public RedHeadDuck(){
flyBehavior=new FlyWithWings();
quarkBehavior=new Quark();
}
public void display(){
System.out.println("I am a red head duck");
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Duck duck=new RedHeadDuck();
duck.display();
duck.swim();
duck.performQuark();//会叫
duck.performFly();//会飞
duck.setFlyBehavior(new FlyWithNoWings());//不会飞
duck.setQuarkBehavior(new MuteQuark());//不会叫
}
}