摘要:抽象策略角色这是一个抽象角色,通常由一个接口或抽象类实现。,不知道会不会有人这么做,一般都是加盐加醋用户类加密接口加密接口两个实现类使用伪加密伪加密输出伪加密伪加密参考来源设计模式策略模式上文概念内容大部分来源于这文章设计模式
概念
策略模式:定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户
该模式涉及三个角色:
● 环境(Context)角色:持有一个Strategy的引用。
● 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
● 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
策略模式的使用场景:
1)针对同一种问题的多种处理方式、仅仅是因为具体行为有差别时,
2)需要安全的封装多种同一类型的操作时
3)出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时
举个栗子把生活中的鸭子看作环境角色,它们的行动看作抽象策略角色,每种动作的实现看作具体策略角色。比如,鸭子飞行和叫声的行为,有的可以用翅膀飞行,有不能飞行;有的是呱呱叫,有的是吱吱叫。他们之间的关系图是:
鸭子自身不实现飞行和叫声的行为(算法),把这两个行为(算法)托付给了两个接口。每当需要创建出鸭子来的时候,可以决定鸭子这个鸭子的飞行方式和叫声。如果鸭子进化成可以说人话,只需要实现QuackBehavior接口即可,而不用修改鸭子的内部。
再一个栗子在编程中,用户的密码保存到数据库前往往需要对密码加密,可以使用这个模式定义不同的加密算法,随机使用不同的算法加密。[emmm,不知道会不会有人这么做,一般都是加盐加醋]
用户类
public class User { /** * 加密接口 */ private Encryption encryption; private String password; public void setEncryption(Encryption encryption) { this.encryption = encryption; } public void setPassword(String password) { this.password = password; } public String getPassword() { return encryption.encrypt(password); } }
加密接口
public interface Encryption { String encrypt(String s); }
两个实现类
public class Md5Encrypt implements Encryption{ @Override public String encrypt(String s) { return s + "md5"; } }
public class SHAEncrypt implements Encryption{ @Override public String encrypt(String s) { return s + "sha"; } }
使用:
public class Main { public static void main(String[] args) { User user = new User(); user.setEncryption(new Md5Encrypt()); user.setPassword("1234"); System.out.println("伪MD5加密:" + user.getPassword()); user.setEncryption(new SHAEncrypt()); System.out.println("伪SHA加密:" + user.getPassword()); } }
输出:
伪MD5加密:1234md5 伪SHA加密:1234sha参考来源
java设计模式--策略模式上文概念内容大部分来源于这文章
Head First 设计模式
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/76847.html
摘要:可以使用其他模式来修正这个缺陷,如工厂方法模式代理模式或享元模式。我们的策略模式只是实现了策略的管理,但是没有严格地定义适当的场景使用适当的策略,在实际项目中,一般通过工厂方法模式来实现策略类的声明。源码地址参考文献设计模式之禅 定义 Define a family of algorithms,encapsulate each one,and make them interchange...
摘要:孙膑心里一万个草泥马在奔腾,差点没噎死自己滚一边去,我们这盘跟他赛马开始,策略模式上场。在设计模式之禅中的提出通过策略枚举和反射机制对策略模式进行改良,膜拜了但是要添加或淘汰策略,还是得去对枚举进行修改,也不符合开闭原则。 今天给大家说说田忌赛马的故事。如有雷同,纯属巧合!话说在战国时期,群雄割据,硝烟四起,茶余饭后还是少不了娱乐活动的,其中赛马是最火爆的。一天,孙膑看到田忌像个死鸡似...
摘要:注解方式优点使用注解方式可以极大的减少使用模版方法模式带来的扩展时需要继承模版类的弊端,工厂注解的方式可以无需关心其他业务类的实现,而且减少了类膨胀的风险。 在上一篇文章Java设计模式综合运用(门面+模版方法+责任链+策略)中,笔者写了一篇门面模式、模版方法、责任链跟策略模式的综合运用的事例文章,但是后来笔者发现,在实现策略模式的实现上,发现了一个弊端:那就是如果在后续业务发展中,需...
阅读 3205·2021-11-22 12:07
阅读 1826·2021-10-12 10:11
阅读 962·2019-08-30 15:44
阅读 2891·2019-08-30 12:45
阅读 2077·2019-08-29 16:41
阅读 1508·2019-08-29 16:35
阅读 2582·2019-08-29 12:57
阅读 1102·2019-08-26 13:51