设计模式(一) - 策略模式

本文介绍了策略模式在编程中的应用,通过抽象出鸭子行为接口及其实现类,展示了如何根据鸭子类型动态切换飞行和叫声。代码实例演示了如何让小黄鸭和小木鸭实现飞与叫的不同行为,以及如何在运行时修改小木鸭的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

小黄鸭 ~ 小木鸭 ~ 机械鸭 ~ 北京烤鸭 ~

都是鸭子的种类,有的会飞,有的不会飞,有的吱吱叫,有的呱呱叫,有的不会叫~
但是他们都是属于鸭科,都有某些相同的行为.

通过简单的代码来模拟实现各种鸭子.

首先抽象出鸭子的父类

public abstract class Duck {
    /**
     * 飞的行为
     */
    Fly fly;
    /**
     * 叫的行为
     */
    QuackBehavior quackBehavior;

    /**
     * 描述
     */
    public abstract void desc();

    public void setFly(Fly fly) {
        this.fly = fly;
    }

    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }

    /**
     * 通过父类代理,实现某种行为
     */
    public void showFly(){
        fly.fly();
    }

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

有了父类就有具体的子类,我们写两个小鸭子~

public class XiaoHuangYa extends Duck {

    public XiaoHuangYa() {
        fly = new FlyWithWings();
        quackBehavior = new Quack();
    }

    @Override
    public void desc() {
        System.out.println("我是小黄鸭~ 会叫会飞 ");
    }
}
public class XiaoMuYa extends Duck {


    public XiaoMuYa() {
        fly = new FlyWithWings();
        quackBehavior = new NotQuack();
    }

    @Override
    public void desc() {
        System.out.println("我是小木鸭子~ 会飞不会叫");
    }
}

然后创建行为接口,之前说了鸭子的两个行为. 飞和叫的接口,并创建出具体的子类,来执行具体的飞行操作.

public interface Fly {

    void fly();
}
public class FlyNoWay implements Fly {
    @Override
    public void fly() {
        System.out.println(" 不会飞啊~");
    }
}
public class FlyWithWings implements Fly{
    @Override
    public void fly() {
        System.out.println(" 飞呀飞~");
    }
}
public interface QuackBehavior {

    void quack();
}
public class Quack implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println(" 呱呱呱~");
    }
}
public class NotQuack implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println(" 不会叫啊~");
    }
}

现在我们根据不同鸭子具有的不同的行为,让父类代理执行.

public static void main(String[] args) {
        // 创建一个小黄鸭
        Duck xiaoHuangYa = new XiaoHuangYa();
        xiaoHuangYa.desc();
        xiaoHuangYa.showFly();
        xiaoHuangYa.showQuack();
        // 创建一个小木鸭
        Duck xiaoMuYa = new XiaoMuYa();
        xiaoMuYa.desc();
        xiaoMuYa.showFly();
        xiaoMuYa.showQuack();
    }

运行结果
在这里插入图片描述
当然,小木鸭装了火箭的发动机之后也可以飞了,我们可以在运行后动态设置或改变它的行为

创建火箭式的飞

public class HuoJianFly implements Fly {
    @Override
    public void fly() {
        System.out.println(" 我是小火箭 ~");
    }
}
public static void main(String[] args) {
        // 创建小木鸭
        Duck xiaoMuYa = new XiaoMuYa();
        // 安装火箭发动机
        xiaoMuYa.setFly(new HuoJianFly());
        xiaoMuYa.desc();
        xiaoMuYa.showFly();
        xiaoMuYa.showQuack();
    }

执行结果
在这里插入图片描述
在这里插入图片描述

设计原则:
1.将不需要变化的行为和经常变化的行为分开,经常变化的单独维护,不要混在一起.
2.针对接口编程,而不是针对实现类编程
3.多用组合,少用继承

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值