设计模式之策略模式
设计模式:1.可变的与不可变的分开。2.针对接口编程
1:可变与不可变分开,不分开会怎么样?继承后要将每一个方法都重新实现?
2:接口可以作为一个标识符,比如一些空接口的存在,而且接口可以多实现
什么是策略模式呢:
它定义了算法族,分别封装,让它们之间可以相互代替,此模式让算法的变化独立于使用算法的客户!
系统的改变是我们所害怕的,但是由于策略模式的存在,我们可以动态或者随意的更换算法,从而不必害怕系统改变了。
/*我们要实现的类从这个鸭子大类继承过去,各种类别的鸭子~*/
/*我们将固定的与可变的分开,固定的在这里完成,有各种具体形式的可变的从接口的引用实现,而display这种可以可变而且没有形式则也在这里实现*/
public abstract class Duck {
FlyBehavior flybehavior;//两个接口引用
QuackBehavior quackbehavior;
public Duck(){}
public abstract void display();
public void performFly(){
flybehavior.fly();
}
public void performQuack(){
quackbehavior.quack();
}
public void swim(){
System.out.println("所有的鸭子都会游泳");
}
}
/*叫这个行为的接口*/
public interface QuackBehavior {
public void quack();
}
public interface FlyBehavior {
public class FlyWithWings implements FlyBehavior{
// TODO Auto-generated method stub
System.out.println("l'm flying!");
}
public class FlyNoWay implements FlyBehavior{
// TODO Auto-generated method stub
System.out.println("I can't fly");
}
public class Quack implements QuackBehavior{
// TODO Auto-generated method stub
System.out.println("Quack");
}
public class MuteQuack implements QuackBehavior{
// TODO Auto-generated method stub
System.out.println("<< silence >>");
}
public class Duck1 extends Duck{
quackbehavior = new Quack();
flybehavior = new FlyWithWings();
}
public void display() {
// TODO Auto-generated method stub
System.out.println("the first duck");
}
public class testDuck{
Duck test = new Duck1();
test.performFly();
test.performQuack();
test.display();
test.swim();
}
}
Quack
the first duck
所有的鸭子都会游泳
flybehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb){
quackbehavior = qb;
}
public class modelDuck extends Duck{
flybehavior = new FlyNoWay();
quackbehavior = new MuteQuack();
}
public void display() {
// TODO Auto-generated method stub
System.out.println("a model duck");
}
}
public class FlyRocketPowered implements FlyBehavior{
public void fly() {
// TODO Auto-generated method stub
System.out.println("i'm flying with a rocket~");
}
modelduack.performFly();
modelduack.setFlyBehavior(new FlyRocketPowered());
modelduack.performFly();
i'm flying with a rocket~