设计模式学习总结(一)策略模式Strategy Pattern

策略模式:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

继承让所有的子类都有父类的行为,如果子类的行为经常改变,让所有的子类都有父类的行为是不恰当的。

接口解决了一部分问题,让实现了接口的子类才有这类行为,但是接口不具有实现代码,无法达到代码复用,因此当需要修改一个行为的时候,必须往下追踪每个定义次行为的类来修改,容易造成新的错误。

设计原则:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
把会变化的部分取出并封装起来,以便以后可以轻易的改变或扩充此部分,而不影响不需要变化的其他部分。

设计原则:针对接口编程,而不是针对实现编程。
针对接口编程关键在于利用多态,程序可以针对超类型编程,执行的时候会根据实际情况执行到真正的行为,不会绑死在超类型的行为上。更确切地说,变量的声明类型应该是超类型,通常是一个接口或者是抽象类,这样只要是具体实现此超类型的类所产生的对象,都可以指定给这个变量。这意味着,声明类时不用理会以后执行时的真正对象类型。(子类的实例化动作不用在代码中硬编码,而是”在运行时指定具体的实现对象“)
Animal animal = new Dog();
animal.makeSound(); //利用超类型引用animal进行多态调用

设计原则:多用组合,少用继承。
使用组合建立系统具有很大的弹性,不仅可以将算法族封装成类,更可以“在运行时动态地改变行为”,只要组合的的行为对象符合正确的接口标准即可。

策略模式类图:
这里写图片描述

代码实现:

/**
 *
 * @author Yves
 */
public class Duck {

    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    public Duck() {
    }

    public void swim() {
        System.out.println("All ducks float, even decoys!");
    }

    public void performFly() {
        flyBehavior.fly();
    }

    public void performQuack() {
        quackBehavior.quack();
    }

    public void display() {
        System.out.println("I'm a Duck!");
    }

    public void setFlyBehavior(FlyBehavior fb){
        flyBehavior = fb;
    }

    public void setQuackBehavior(QuackBehavior qb){
        quackBehavior = qb;
    }
}
public interface FlyBehavior {
    public void fly();
}
public class FlyWithWings implements FlyBehavior{

    @Override
    public void fly() {
        System.out.println("Fly with wings");
    }

}
public class FlyRocketPowered implements FlyBehavior{

    @Override
    public void fly() {
        System.out.println("I'm flying with a rocket!");
    }

}
public class FlyNoWay implements FlyBehavior{

    @Override
    public void fly() {
        System.out.println("I can't fly!");
    }

}
public interface QuackBehavior {
    public void quack();
}
public class Quack implements QuackBehavior{

    @Override
    public void quack() {
        System.out.println("Quack, quack!");
    }

}
public class Squeak implements QuackBehavior{

    @Override
    public void quack() {
        System.out.println("Squeak, squeak!");
    }

}
public class MuteQuack implements QuackBehavior{

    @Override
    public void quack() {
        System.out.println("`` ``");
    }

}
public class MallardDuck extends Duck{
    public MallardDuck(){
        flyBehavior = new FlyWithWings();
        quackBehavior = new Quack();
    }

    @Override
    public void display(){
        System.out.println("I'm a real mallard duck!");
    }
}
public class ModelDuck extends Duck{
    public ModelDuck(){
        flyBehavior = new FlyNoWay();
        quackBehavior = new Quack();
    }

    @Override
    public void display(){
        System.out.println("I'm a model duck!");
    }
}
public class MiniDuckSimulator {

    public static void main(String[] args) {
        MallardDuck mallardDuck = new MallardDuck();
        mallardDuck.display();
        mallardDuck.performFly();
        mallardDuck.performQuack();
        System.out.println("--------");
        ModelDuck modelDuck = new ModelDuck();
        modelDuck.display();
        modelDuck.performFly();
        modelDuck.setFlyBehavior(new FlyRocketPowered());
        modelDuck.performFly();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值