设计原则:
1、找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
2、针对接口编程,而不是针对实现编程。“针对接口编程”真正的意思是“针对超类型编程”,关键技术就是利用多态。
3、多用组合,少用继承。当你将两个类结合起来使用,这就是组合,与继承不同的地方在于,行为不是继承而来 的,而是和适当的行为对象“组合”而来的。
理解:Duck是一个抽象类,在这个类里面可以加入其他类(接口吧)的实例(放在属性里面),然后某些方法调用这个实例的具体的方法实现某些功能,这就实现了不用继承某个类,然后也能使用这个类里面的方法的目的,这就是组合。Duck类是一个抽象类,所以呢,需要一个类来继承他,这个类的话呢可以在他的构造器里面给父类的属性赋值,也就是加上某些类。
下面是策略模式的一个简单实现:
①Duck等类:
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 setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
@Override
public void display() {
System.out.println("I'm a real Mallard Duck!");
}
}
①FlyBehavior 接口:
public interface FlyBehavior { // 所有飞行类都要实现的接口
public void fly();
}
两个实现类:
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("I can't fly!");
}
}
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("I'm flying!!!");
}
}
③QuackBehavior 以及实现:
public interface QuackBehavior {
public void quack();
}
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("Quack!");
}
}
public class Squeak implements QuackBehavior {
@Override
public void quack() {
System.out.println("Squeak!");
}
}
④ModelDuck
public class ModelDuck extends Duck {
public ModelDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyNoWay();
}
@Override
public void display() {
System.out.println("I'm a model duck!");
}
}
⑥测试类MiniduckSimulator2
public class MiniduckSimulator2 {
public static void main(String[] args) {
Duck duck = new MallardDuck();
duck.display();
duck.performFly();
duck.performQuack();
Duck model = new ModelDuck();
model.performFly();
model.setFlyBehavior(new FlyWithWings());
model.display();
model.performFly();
}
}
策略模式定义了算法簇,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
这里所说的算法就是超类的两个属性:flyBehavior和quackBehavior 的实现类,根据客户的需要实例化他们不同的实现类。
源码下载地址:设计模式源码地址