Head First 设计模式第一章(策略模式)

设计原则:

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 的实现类,根据客户的需要实例化他们不同的实现类。


源码下载地址:设计模式源码地址

猜你喜欢

转载自blog.csdn.net/qq_15916363/article/details/79851614