一分钟读懂设计模式--策略模式

一、使用场景

1、多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。 

策略模式:优点:统一所有的算法,行为,避免客户端再去些复杂的算法或行为

                  缺点:客户端必须知道所有的策略,并自行选择策略,也就是说必须知道算法,行为规则,根据自己去选择。

旅游为例子,可以做火车,飞机,骑自行车。

//公共接口
public interface ITravelStrategy {
    void toTravel();
}
//具体策略
public class PlaneStrategy implements ITravelStrategy {
    @Override
    public void toTravel() {
        System.out.println("坐飞机去旅游");
    }
}
//具体策略
public class TrainStrategy implements ITravelStrategy {
    @Override
    public void toTravel() {
        System.out.println("坐火车去旅游");
    }
}
//具体策略
public class BicycleStrategy implements ITravelStrategy {
    @Override
    public void toTravel() {
        System.out.println("骑自行车去旅游");
    }
}
//旅行类
public class Traveler {
    private ITravelStrategy iTravelStrategy;

    public Traveler(ITravelStrategy iTravelStrategy) {
        this.iTravelStrategy = iTravelStrategy;
    }

    public void travel() {
        iTravelStrategy.toTravel();
    }
}

//具体使用
//        Traveler traveler  = new Traveler(new BicycleStrategy());
//        Traveler traveler  = new Traveler(new TrainStrategy());
        Traveler traveler  = new Traveler(new PlaneStrategy());
        traveler.travel();

是不是与简单工厂模式很像,那就来说一下吧;

二、与简单工厂对比

简单工厂模式: 根据客户选择的条件,来帮客户创建一个对象。
策略模式:        客户给它一个创建好的对象,它来帮客户做相应的事。

简单工厂模式的缺点就是当有新的需求增加时,需要频繁的修改工厂类。

只用策略模式,当有新的需求增加时需要修改的是客户端,客户端仍然承担着创建对象的职责,并没有减轻客户端的压力。

三、与简单工厂结合使用

//旅行类
public class Traveler {
    private ITravelStrategy iTravelStrategy;

    public Traveler(String strategyType) {
        if ("plane".equals(strategyType)) {
            iTravelStrategy = new PlaneStrategy();
        } else if ("train".equals(strategyType)) {
            iTravelStrategy = new TrainStrategy();
        } else {
            iTravelStrategy = new BicycleStrategy();
        }
    }

    public void travel() {
        iTravelStrategy.toTravel();
    }
}

//使用
Traveler traveler = new Traveler("plane");
traveler.travel();

相对于策略模式,不用客户端再去创建对象了,保留了它去为客户端做事情。

相对与简单工厂,不会返回对象让客户端自己去做事情,保留了他为客户端创建对象的特点。

这个结合的理解感觉还是不到位,欢迎指正。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值