定义:定义了算法簇,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
优点:代码的复用性高,当有新的需求产生时,不需要更改之前的代码,直接在接口中增加需求即可。
代码实例:
以鸭子为例,假设所有鸭子都会游泳包括模型鸭子,但是不是所有鸭子都会飞,根据设计原则把会变化的代码独立出来,因此把飞独立出来作为一个接口,接口里有一个方法是飞,他的子类实现飞这个动作的具体实现。鸭子需要一个超类,把游泳这种不会变化的和已经封装好的会变化的方法放入这个超类中,这样具体的鸭子继承这个超类就可以继承他的行为并且具有自己的特色。
//Duck的超类
public Class Duck(){
public Duck(){};
private FlyBehavire flyBehavier;
public void setFlyBehavier(FlyBehavier fb){
flyBehavier=fb;
}
public void swim(){
System.out.println("This duck can swim");
}
public void performFly(){
flyBehavier.fly();
}
}
//Duck的飞的行为的封装
public interface FlyBehavier(){
public void fly();
}
//Duck飞行的实现类
public class DuckWithFly() implements FlyBehavier(){
public void fly(){
System.out.println("This duck can fly");
}
}
//Duck飞行的实现类
public class DuckNoFly() implements FlyBehavier(){
public void fly(){
System.out.println("This Duck can not fly");
}
}
//Duck飞行的实现类
public class DuckFlyWithTool() implements FlyBehavier(){
public void fly(){
System.out.println("This duck can fly with Tool");
}
}
//Duck的子类
public class FlyDuck() exetends Duck{
public FlyDuck(){
flyBehavier = new DuckNoFly();
}
}
//测试类
public class TestDuck(){
public static void main(String[] args){
FlyDuck flyDuck=new FlyDuck();
flyDuck.swim();
flyDuck.performFly();
//在运行过程中动态改变鸭子的行为状态,由不会飞变成了带上工具会飞
fluDuck.setFlyBehavier(new DuckFlyWithTool());
flyDuck.performFly();
}
}