zoukankan      html  css  js  c++  java
  • java设计模式-策略模式

    定义:定义一系列的算法,将它们封装起来,且这些算法具有一定的相似性,通过接口访问它们时可以相互替换。
    理解:就是说对于不同的策略,有不同的具体实现方法,这些具体实现方法继承自同一个接口,业务逻辑层通过接口访问具体实现方法。
    几种类型的类
    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方法不同

  • 相关阅读:
    20145220&20145209&20145309信息安全系统设计基础实验报告
    20145209 《信息安全系统设计基础》第8周学习总结
    R574
    gym102219
    102222F
    luogu 1337
    luogu 2503 & bzoj 2428
    18 BJ J
    poj 1981
    101992 I
  • 原文地址:https://www.cnblogs.com/wangxiaopei/p/8551207.html
Copyright © 2011-2022 走看看