策略模式【Strategy Pattern】

小故事: 大雄每次去找静香玩耍的时候都会被胖虎还有小夫欺负,这个时候大雄每次都会找哆啦A梦帮忙;哆啦A梦就会从它的口袋里面拿出各种各样的工具去帮助大雄找回场子。这里面其实就体现出来了策略模式;那么用java程序如何来进行表示呢?

代码演示:

1、各种工具其实都是从口袋中拿出来的,首先可以创建一个口袋的接口:

package com.design.dp.strategy;

// 策略接口,里面是各种各样的工具
public interface KouDai {
    void tools();
}

2、既然有了口袋接口,肯定可以拿出来不同的工具:

package com.design.dp.strategy;
//这是一个可以变大的房子
public class XiaoFangZhi implements KouDai{
    @Override
    public void tools() {
        System.out.println("大雄拿着我去找静香了。。。");
    }
}
package com.design.dp.strategy;
// 这是一个缩小灯
public class SuoXiaoDeng implements KouDai{
    @Override
    public void tools() {
        System.out.println("被我照到全部都会缩小哦");
    }
}

package com.design.dp.strategy;
//这是一个竹蜻蜓
public class ZhuQingTing implements KouDai{
    @Override
    public void tools() {
        System.out.println("戴上我就可以自由飞翔~~~");
    }
}

3、此时工具已经有了,那么口袋是在哪呢?没错,口袋在哆啦A梦身上

package com.design.dp.strategy;
// 这是一个哆啦A梦
public class Doraemon {
    // 口袋在哆啦A梦身上是很合情合理的事情!
    private KouDai kouDai;
    public Doraemon(KouDai kouDai) {
        this.kouDai = kouDai;
    }
    // 哆啦A梦会从口袋中拿出工具帮助大雄
    public void tools(){
        this.kouDai.tools();
    }
}

4、一切已经就绪了,大雄此时雄赳赳气昂昂的出门了

package com.design.dp.strategy;

public class DaXiong {
    public static void main(String[] args) {
        Doraemon doraemon;
        System.out.println("大雄碰见静香了");
        doraemon = new Doraemon(new XiaoFangZhi());
        doraemon.tools();
        System.out.println("大雄和静香在房子里不知道在干什么");
        
        System.out.println("此时胖虎过来了");
        doraemon = new Doraemon(new SuoXiaoDeng());
        doraemon.tools();
        System.out.println("胖虎被缩小灯照到了,然后哭着回家找妈妈去了");
        
        System.out.println("转角大雄碰见了小夫一群人");
        doraemon = new Doraemon(new ZhuQingTing());
        doraemon.tools();
        System.out.println("大雄不慌不急的拿出了竹蜻蜓飞走了");
    }
}

好处: 体现了高内聚低耦合的特性呀;扩展性也相对较好,只需要添加具体的策略(工具)。然后调用就行了;
缺点: 当策略越来越多时,这个时候维护可能就会越来越麻烦了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值