zoukankan      html  css  js  c++  java
  • 23中java设计模式(1)-- 策略模式

    近来不太忙,就打算抽空看下源码补充一下知识,当我看了之后我发现看源码的关键是要弄清楚类之家的关系以及为何要这样的关系,否则如果只看具体的代码那不如去学习会儿算法。

    于是就打算从设计模式入手,边学习边记录自己的心得体会, 如果有什么不对的地方。 欢迎各位大神指正。

    策略模式

    首先为什么叫策略模式,核心在于策略,说白了就是功能的实现代码。 只是这个代码不与其他类相耦合,但又与业务有关。

    就拿英雄联盟举例子吧,平常玩的多些。

    现在有四个英雄分别为 : 盖伦、皇子、赵信、诺手。 我们知道游戏中英雄有一个通用的都叫平A。那么这个时候就可以建立一个最基本的平A类

    1
     public Class A{public void   ordinary() {
            System.out.println("平A");      
         } 
    }
    
    
    
    
    

    然后当我们鼠标右键点击地方英雄时,就调用方法即可。 但是如果增加Q技能呢,我们知道英雄不一样Q技能是不同的。咱们通常的做法是,声明一个Q技能的接口,然后具体的英雄去实现,也即是

    1 public interface Q{
    2     public void qSkill();
    3 }
    4 
    5 public Class GaiLun implements Q extends A {
    6     public void qSkill() {
    7         System.out.println("盖伦的Q技能");
    8     }  
    9 }

    当我们以这种方式实现时,这样带来的麻烦是不断的去实现、继承、重写。并且q技能的接口与各个实现类都在耦合,接口一动那么多实现类都要修改,前期英雄少还能接受,后面那么多英雄这个工作量可不小。所以这时候要做的就是把英雄类与Q技能接口解耦。把Q技能单独抽取出来个接口,就成了上面说的策略。也就是把英雄的Q技能的算法抽取成策略类。并在类A中引入策略接口的引用。

    public Interface Q{
        public void qSkill();
    }
    
    public Class GaiLun implements Q{
        public void qSkill() {
            System.out.println("盖伦的Q");
        }
    }
    
    public Class HuangZi implements Q{
        public void qSkill() {
            System.out.println("皇子的Q");
        }
    }
    
    public Class ZhaoXin implements Q{
        public void qSkill() {
            System.out.println("赵信的Q");
        }
    }
    
    public Class NuoShou implements Q{
        public void qSkill() {
            System.out.println("诺手的Q");
        }
    }

    这里就把策略接口和算法类抽取了出来,下面就是使用了。

    public Class A{
         private Q q;
    
         public void   ordinary() {
            System.out.println("平A");      
         }  
         
          public void setQ(Q q){
              this.q = q;
          }
          
          public void qSkill(){
              q.qSkill();
          }
    }

    在平A中添加Q技能接口的引用,并添加set方法和技能方法的调用。下面就是测试一下。

    public Class test{
        public static void main(String[] args){
            GaiLun gl = new GaiLun();
            HuangZi hz = new HuangZi();
            ZhaoXin zx = new ZhaoXin();
    // 不用策略模式的调用 gl.
    qSkill(); // 释放Q技能
    gl.ordinary(); // 释放平A
    // 使用策略模式的调用
    A a = new A();
    a.setQ(new GaiLun());
    a.qSkill(); // 盖伦的Q
    a.setQ(new ZhaoXin());
    a.qSkill(); // 赵信的Q
    } }

    优点:可以看到当我释放技能时我的英雄类与Q技能类不再存在关系,而是我传进set方法的是什么才是什么。 就算我Q技能接口增加什么别的操作也不用每个英雄类都作出修改。

    缺点:就是每个英雄都会有一个类,当英雄多了那么类也就随之过多。

    这里的例子感觉不是很恰当,没有把优缺点体现充分。 如有问题请大神指出,

    转载请注明出处!

    参考: https://www.cnblogs.com/ZhangHaoShuaiGe/p/7826774.html

  • 相关阅读:
    Visula Studio 2013 初始化静态浮点型数据在C++类内
    catkin_make与gtest出现冲突的问题与解决
    用Visual studio2012在Windows8上开发内核驱动监视线程创建
    用Visual studio2012在Windows8上开发内核驱动监视进程创建
    TEA加密算法的C/C++实现
    说说某游戏保护驱动中驱动黑名单的具体实现
    [Windows驱动开发](四)内存管理
    [Windows驱动开发](三)基础知识——驱动例程
    [Windows驱动开发](二)基础知识——数据结构
    [Windows驱动开发](一)序言
  • 原文地址:https://www.cnblogs.com/qiaoyutao/p/10672552.html
Copyright © 2011-2022 走看看