java设计模式-策略模式

xiaoxiao2021-02-28  121

定义:定义一系列的算法,将它们封装起来,且这些算法具有一定的相似性,通过接口访问它们时可以相互替换。 理解:就是说对于不同的策略,有不同的具体实现方法,这些具体实现方法继承自同一个接口,业务逻辑层通过接口访问具体实现方法。 几种类型的类 1.抽象策略类(具体实现的抽象接口层) 2.具体策略类(实现抽象策略类,具体实现层) 3.场景角色类(关联抽象策略类,业务逻辑层) 具体应用 1.抽象策略接口

package com.java.celv; /** * @author wangpei * @version 创建时间:2017年5月7日 下午3:11:40 * 抽象策略角色 */ public interface Strategy { public void doThing(); }

2.具体策略类1

package com.java.celv; /** * @author wangpei * @version 创建时间:2017年5月7日 下午3:34:19 鸡类 */ public class ConcreteStrategy2 implements Strategy { @Override public void doThing() { System.out.println("我可以打鸣"); } }

3.具体策略类2

package com.java.celv; /** * @author wangpei * @version 创建时间:2017年5月7日 下午3:30:21 * 猴子类,具体策略类 */ public class ConcreteStrategy1 implements Strategy{ @Override public void doThing() { System.out.println("我可以爬树"); } }

4.业务逻辑类

package com.java.celv; /** * @author wangpei * @version 创建时间:2017年5月7日 下午3:35:14 * 场景角色类,对抽象策略类的调用 */ public class Context { public Strategy st; public Context(Strategy st){ this.st=st; } public void execute(){ st.doThing(); } public static void main(String[] args) { ConcreteStrategy1 c1=new ConcreteStrategy1(); Context x1=new Context(c1); x1.execute(); ConcreteStrategy2 c2=new ConcreteStrategy2(); Context x2=new Context(c2); x2.execute(); } }

不用策略模式时,通过if-else

package com.java.celv; /** * @author wangpei * @version 创建时间:2017年5月7日 下午3:41:18 * 不用策略模式的实现 */ public class Wucelv { public void execute(){ if("传入的类型".equals("鸡类型")) System.out.println("我可以打鸣"); else if("传入的类型".equals("猴子类型类型")) System.out.println("我可以爬树"); else System.out.println("未有改类型"); } public static void main(String[] args) { } }

从上面的代码很容易看出,抽象接口类实现对底层具体实现类的底层封装,context业务逻辑层通过接口调用其具体方法。 优点 1.各策略类间可以自由切换 2.降低各类间的耦合度,避免使用太多的if-else -if连接 3.易于扩展,当增加一种策略时,只需实现继承抽象接口的策略类即可,代码修改量少。 缺点 1.随着策略的增加,需要维护过多的策略类,浪费资源。 2.客户端必知道各个策略类具体功能,然后才能应对不同的策略调用不同的策略类。 策略模式在java中的应用 1.Arrays.sort(T[], Comparator < ? super T > c) 具体看: http://blog.csdn.net/wisgood/article/details/16541013 对于不同的策略,其实现Comparator接口对应的compare方法不同

转载请注明原文地址: https://www.6miu.com/read-80118.html

最新回复(0)