java设计模式-策略模式

要点:

 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

策略模式三个对象:
(1) 环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。(ContentStrategy

(2) 抽象策略对象:它可由接口或抽象类来实现。EncryptStrategy
(3) 具体策略对象:它封装了实现不功能的不同算法。(MD5EncryptStrategy、RASEncryptStrategy)

接口:

/**
 * Description:加密解密接口
 * User: lc
 * Date: 2017/9/29 0029
 * Time: 下午 4:34
 */
public interface EncryptStrategy {
    /**
     * 加密
     *
     * @return
     */
    String encrypt(String str);

    /**
     * 解密
     *
     * @return 成功:true;失败:false
     */
    Boolean decode(String str);
}


MD5算法:

/**
 * Description:MDS加密解密算法
 * User: lc
 * Date: 2017/9/29 0029
 * Time: 下午 4:37
 */
public class MD5EncryptStrategy implements EncryptStrategy {
    @Override
    public String encrypt(String str) {
        return "MD5";
    }

    @Override
    public Boolean decode(String str) {
        return str == null || str.length() == 0 ? Boolean.FALSE : Boolean.TRUE;
    }
}


RAS算法:

/**
 * Description:RAS加密解密算法
 * User: lc
 * Date: 2017/9/29 0029
 * Time: 下午 4:40
 */
public class RASEncryptStrategy implements EncryptStrategy {
    @Override
    public String encrypt(String str) {
        return "RAS";
    }

    @Override
    public Boolean decode(String str) {
        return str == null || str.length() == 0 ? Boolean.FALSE : Boolean.TRUE;
    }
}


上下文或者环境:

/**
 * Description:策略上下文
 * User: lc
 * Date: 2017/9/29 0029
 * Time: 下午 4:42
 */
public class ContentStrategy {
    private EncryptStrategy encryptStrategy;



    public void setEncryptStrategy(EncryptStrategy encryptStrategy) {
        this.encryptStrategy = encryptStrategy;
    }
    /**
     * 加密
     *
     * @return
     */
    public String encrypt(String str) {
        return encryptStrategy.encrypt(str);
    }
    /**
     * 解密
     *
     * @return 成功:true;失败:false
     */
    public Boolean decode(String str) {
        return encryptStrategy.decode(str);
    }
    ;
}


测试代码:

/**
 * Description:
 * User: lc
 * Date: 2017/9/29 0029
 * Time: 下午 4:44
 */
public class Test {
    public static void main(String[] args) {
        ContentStrategy cs = new ContentStrategy();
        String str = "RAS";
        if ("MD5".equals(str)) {
            cs.setEncryptStrategy(new MD5EncryptStrategy());
        } else {
            cs.setEncryptStrategy(new RASEncryptStrategy());
        }
        System.out.println("密码的策略:" +cs.encrypt("0000"));;
    }
}

测试结果:

密码的策略:RAS
Process finished with exit code 0

优点:

新增算法,只需要实现相应的接口,不改变原有的组件,比如(ContentStrategy、EncryptStrategy

缺点:

需要随着算法的增多,增加了客户端调用的复杂度,以及客户端需要明确知道有哪几种算法。

策略模式与工厂模式的比较

工厂模式是创建型模式 ,它关注对象创建,提供创建对象的接口. 让对象的创建与具体的使用客户无关。
策略模式是对象行为型模式 ,它关注行为和算法的封装 。它定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。使得算法可独立于使用它的客户而变化
例子
策略模式的做法:
有几种方案供你选择旅行,选择火车好呢还是骑自行车,完全有客户自行决定去构建旅行方案(比如你自己需要去买火车票,或者机票)。

工厂模式的做法:你决定哪种旅行方案后,不用关注这旅行方案怎么给你创建,也就是说你告诉我方案的名称就可以了,然后由工厂代替你去构建具体方案(工厂代替你去买火车票)。


上面的例子里面client代码:

 cs.setEncryptStrategy(new MD5EncryptStrategy());

我们看到客户需要自己去创建具体算法(new MD5EncryptStrategy())实例。传递的是具体实例
而工厂模式你只要告诉哪种旅行就可以了,不是传递一个具体实例,而是一个标识(旅行方案标识)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值