java设计模式——策略模式

本文通过模拟鸭子游戏介绍了面向对象的传统方法和策略模式。首先利用传统方法创建鸭子的超类,然后通过策略模式解决鸭子飞行行为的变化问题。策略模式通过封装行为接口,实现了行为算法和使用者的解耦。

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

1.利用传统方法“模拟鸭子游戏”

首先我们用面向对象的传统方法来完成这个项目
创建鸭子的超类:拥有叫、外观以及游泳的特性

public abstract class Duck {
    public Duck() {
    }
    public void Quack() {
        System.out.println("~~gaga~~");
    }
    public abstract void display();
    public void swim() {
        System.out.println("~~im swim~~");
    }
}

当我们创建不同鸭子时:例如绿头鸭,红头鸭代码如下

public class GreenHeadDuck extends Duck {
    @Override
    public void display() {
        System.out.println("**GreenHead**");
    }
}
public class RedHeadDuck extends Duck {
    @Override
    public void display() {
        System.out.println("**RedHead**");
    }
}

这时他们都具有了叫和游泳的特性。
当我们想给鸭子添加飞行的行为时。会想到在超类中添加飞行的行为

public abstract class Duck {
    ...
    public void Fly() {
            System.out.println("~~im fly~~");
        }
}

这时继承超类的所有子类都拥有了该行为,那么出现了一个问题:有的鸭子可以飞
但飞的的不好,有的飞的好,在超类中加如这一行为显然不能满足需求。当然也可以在子类中重写这一方法例如:

public class GreenHeadDuck extends Duck {
    @Override
    public void display() {
        System.out.println("**GreenHead**");
    }
    public void Fly() {
        System.out.println("~~no fly~~");
    }
}

单如果子类的数量多,显然是不符合实际的。

2.策略模式“模拟鸭子游戏”

首先我们创建飞行的抽象接口:

public interface FlyBehavior {
    void fly();
}

接着创建两个接口实例:飞的好,和飞的不好

public class GoodFlyBehavior implements FlyBehavior
{
    @Override
    public void fly() {
        // TODO Auto-generated method stub
        System.out.println("--GoodFly--");
    }
}
public class    BadFlyBehavior implements FlyBehavior
{
    @Override
    public void fly() {
        // TODO Auto-generated method stub
        System.out.println("--BadFly--");
    }
}

我们再创建一个鸭子的超类

public abstract class Duck {
    FlyBehavior mFlyBehavior;
    public Duck() {
    }
    public void Fly() {
        mFlyBehavior.fly();
    }
    public void Quack() {
        System.out.println("~~gaga~~");
    }
    public abstract void display();
    public void SetFlyBehavoir(FlyBehavior fb) {
        mFlyBehavior = fb;
    }
    public void swim() {
        System.out.println("~~im swim~~");
    }
}

再创建子类

public class GreenHeadDuck extends Duck {
    public GreenHeadDuck() {
        mFlyBehavior = new GoodFlyBehavior();
    }
    @Override
    public void display() {
        // TODO Auto-generated method stub
        System.out.println("**GreenHead**");
    }
}

这样在就可以解决上面的问题了,也可以用SetFlyBehavoir()set行为的方法更灵活的创建对象。

3.策略模式定义

分别封装行为接口。实现算法族,超类里方接口对象,在子类设定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法变化独立于算法使用者。

4.策略模式注意点

1.分析项目中变化部分与不变的部分
2.多用组合少用继承:使用行为类的组合,而不是行为的继承。更有弹性
3.设计模式有没有相应库或框架的直接使用?有些库或框架本身就使用某些设计模式设计的
4.找不到相应的设计模式怎么办,灵活的使用接口,和实现类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值