设计模式1(策略模式)

设计模式原则

  1. 不变的和变化的分开。
  2. 针对接口编程,而不针对实现编程。
  3. 多考虑组合,而不是继承。

策略模式

定义算法族,分别封装,使之可以相互替换,此模式让算法的变化独立于使用算法的客户。

最典型的鸭子问题
比如:鸭子是一类,有普通鸭子,模型鸭子,野鸭等,按照设计模式的第一个原则来考虑,那么鸭子时不变的,变化的是鸭子的一些行为比如叫,飞,速度等等。
这样的话我们就需要有一个不变的类:鸭子类,和一些变化的类:飞,叫,所以我们的飞和叫不加在鸭子的类中
但是所有的鸭子都会有一定的外观,展示出来;
鸭子类

public class Duck{
    public abstract void display();
}

根据第二个原则我们要针对接口,而不针对实现,那么我们飞和叫就要,并应该放在接口中;

public interface FlyBehavior {
    public void fly();
}

public interface QuackBehavior {
    public void quack();
}

那么在我举例中 我们有两种鸭子一种是绿头鸭子,可以飞,也可以叫,一种普通的模型鸭子不会飞,但是可以叫。

绿头鸭子

public class MallardDuck extends Duck{
    @Override
    public void display(){
        System.out.println("I'm a real Mallard duck");
    }
}

模型鸭子

public class ModelDuck extends Duck{
    @Override
    public void display() {
        System.out.println(" i'm a model duck ");
    }
}

那么我们的绿头鸭子又有那些行为呢?我们距离了两种行为,1,可以叫,2可以飞,那么我们就要有2个实现
可以飞

public class FlyWithWings implements FlyBehavior{

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

可以叫

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

同理我们的模型鸭子不会飞但是可以叫
吱吱叫

public class Squeak implements QuackBehavior{

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

不会飞

public class FlyNoWay implements FlyBehavior{

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

现在我们的准备工作准备完成了。那么设计模式的第三个原则,组合我们又要怎么使用呢?这里就要接种我们的 多态 来操作了。
我们先来改造一下我们的鸭子类,让我们的鸭子类具有飞,和叫的基础。

public abstract class Duck {

    public FlyBehavior flyBehavior;

    public QuackBehavior quackBehavior;

    public abstract void display();

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

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

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

    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

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

这样我们的绿头鸭子和模型鸭子已经具有了飞和叫的行为,那么行为方式又该是什么样呢?多态 就体现在这里了
绿头鸭子

package one;

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

}

模型鸭子

package one;

public class ModelDuck extends Duck{

    public ModelDuck(){
        flyBehavior = new FlyNoWay();
        quackBehavior = new Squeak();
    }

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

编写测试类

public class MiniDuckSimulator {
    public static void main(String[] args) {
        Duck mallard = new MallardDuck();
        mallard.performFly();
        mallard.performQuack();
        Duck modelDuck = new ModelDuck();
        modelDuck.performFly();
        modelDuck.performQuack();
    }
}

在这里插入图片描述
这样的组合,我们的鸭子就实现了不同的行为方式。我们把鸭子一系列行为定义成算法族,分别封装,这样就符合了策略模式。

扩展 我们改装了模型鸭子之后,增加了一个飞行器,他会飞了,我们想让他在运行的时候动态改变飞的方式又要怎么做呢?
ps: 上边类中有提示的!!!想要源码的可以私聊我,或者自己复制上面的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值