《HeadFirst设计模式》读书笔记-第1章-策略模式

定义

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

类图

这里写图片描述

代码实现

定义飞行/呱呱叫行为的接口,因为飞行行为和呱呱叫行为的实现方式类似,所以本例只贴出飞行行为代码,呱呱叫行为类似。

public interface FlyBehavior {
    public void fly();
}

定义具体行为类,实现特定的飞行方式

// 定义不能飞行的行为类
public class FlyNoWay implements FlyBehavior {
    public void fly() {
        System.out.println("I can't fly");
    }
}
// 定义带翅膀飞行的行为类
public class FlyWithWings implements FlyBehavior {
    public void fly() {
        System.out.println("I'm flying!!");
    }
}

为鸭子定义抽象类Duck,所有具体的鸭子类都继承自Duck。

public abstract class Duck {
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    public Duck() {
    }

     // 定义flyBehavior/quackBehavior域保存鸭子的行为类,
     // 具体的飞行/呱呱叫行为可通过setFlyBehavior/setQuackBehavior方法动态设置
    public void setFlyBehavior (FlyBehavior fb) {
        flyBehavior = fb;
    }

    public void setQuackBehavior(QuackBehavior qb) {
        quackBehavior = qb;
    }

     // 定义抽象方法display(),让每个子类去实现,
     // 因为每种鸭子的外观都不一样
    abstract void display();

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

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

     // 定义swim()方法,因为所有的鸭子都会游泳,所以放在超类中实现。
    public void swim() {
        System.out.println("All ducks float, even decoys!");
    }
}

实现具体的鸭子类

// 绿头鸭子类
public class MallardDuck extends Duck {

    public MallardDuck() {
        // 构造时设置默认行为
        flyBehavior = new FlyWithWings();
        quackBehavior = new Quack();

    }

    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();
    }

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

测试启动代码

public class MiniDuckSimulator1 {

    public static void main(String[] args) {

        Duck mallard = new MallardDuck();
        mallard.performQuack(); // 执行呱呱叫
        mallard.performFly(); // 执行飞行

        Duck model = new ModelDuck();
        model.performFly();
        // 运行时修改飞行行为
        model.setFlyBehavior(new FlyRocketPowered());
        model.performFly();
    }
}

该模式体现了哪些OO原则

  1. 原则1: 隔离变化原则

    封装可能变化的飞行行为和呱呱叫行为,让飞行行为和呱呱叫行为的实现放在单独的类中,独立于客户Duck。

  2. 原则2: 针对接口编程,而不是针对实现编程

    Duck类中performFly()/performQuack()针对接口编程,具体的行为方式取决于flyBehavior/quackBehavior的具体类型。

  3. 原则3: 多用组合,少用继承

    flyBehavior/quackBehavior使用组合,使Duck类的飞行行为和呱呱叫行为的实现更具有弹性,并可以在运行时通过setFlyBehavior()/setQuackBehavior()方法动态设置。

本章总结

  1. 知道OO基础,并不足以让你设计出良好的系统

  2. 良好的OO设计必须具备可复用,可扩展,可维护3个特性

  3. 模式可以让我们建造出具有良好OO设计质量的系统

  4. 模式被认为是经验证的OO设计经验

  5. 模式不是代码,而是针对设计问题的通用解决方案。你可以把它们应用到特定的应用中

  6. 模式不是被发明的,而是被发现的

  7. 大多数的模式和OO原则,都着眼于软件变化的主题

  8. 我们常把系统中会变化的部分抽出来封装

  9. 模式让开发人员之间有共享的语言,能够最大化沟通的价值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值