一头扎进设计模式-策略模式

定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

用自己的话说:把算法封装好在类里面,通过组合的方式进行算法切换。

代码:
定义一个鸭子接口:

public abstract class Duck {
    //今天开始学习设计模式,策略模式实现鸭子的飞,叫灵活功能
    private Fly flier;
    private Shout shouter;
    public void swim(){
        System.out.println("会游泳");
    }

    public void eat(){
        System.out.println("会吃饭");
    }

    public void performFly(){
        this.getFlier().fly();
    }

    public void performShout(){
        this.getShouter().shout();
    }
    private Fly getFlier() {
        return flier;
    }

    public void setFlier(Fly flier) {
        this.flier = flier;
    }

    private Shout getShouter() {
        return shouter;
    }

    public void setShouter(Shout shouter) {
        this.shouter = shouter;
    }
}

定义一只实体鸭子:

public class DonoDuck extends Duck {
    public DonoDuck(Fly fly,Shout shout){
        this.setFlier(fly);
        this.setShouter(shout);
    }
}

开始定义策略,先定义“飞”的策略
定义一个飞的接口:

public interface Fly {
    void fly();
}

定义两种飞的方式:

public class FlyMethod1 implements Fly {
    /* (非 Javadoc)
     * @see com.jjt.strategy.Fly#fly()
     */
    @Override
    public void fly() {
        // TODO 自动生成的方法存根
        System.out.println("使用了方法一进行飞翔");

    }
}
public class FlyMethod2 implements Fly {
    /* (非 Javadoc)
     * @see com.jjt.strategy.Fly#fly()
     */
    @Override
    public void fly() {
        // TODO 自动生成的方法存根
        System.out.println("使用了方法二进行飞翔");
    }
}

定义叫的策略
定义一个“叫”的接口

public interface Shout {
    void shout();
}

定义两种叫的方法

public class ShoutMethod1 implements Shout {
    /* (非 Javadoc)
     * @see com.jjt.strategy.Shout#shout()
     */
    @Override
    public void shout() {
        // TODO 自动生成的方法存根
        System.out.println("使用了方法1进行大叫");
    }
}
public class ShoutMethod2 implements Shout {
    /* (非 Javadoc)
     * @see com.jjt.strategy.Shout#shout()
     */
    @Override
    public void shout() {
        // TODO 自动生成的方法存根
        System.out.println("使用了方法二进行大叫");
    }
}

测试:

public static void main(String[] args){
        Fly flyM1 = new FlyMethod1();
        Fly flyM2 = new FlyMethod2();
        Shout shoutM1 = new ShoutMethod1();
        Shout shoutM2 = new ShoutMethod2();

        Duck donoDuck = new DonoDuck(flyM1,shoutM1);
        donoDuck.performFly();
        donoDuck.performShout();

        donoDuck.setFlier(flyM2);
        donoDuck.setShouter(shoutM2);

        donoDuck.performFly();
        donoDuck.performShout();

    }

结果:

使用了方法一进行飞翔
使用了方法1进行大叫
使用了方法二进行飞翔
使用了方法二进行大叫
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值