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

    网上的例子:
    僵尸Demo:
    https://blog.csdn.net/qq_32175491/article/details/79465496


    不同充值方式的打折:
    https://blog.csdn.net/u011507568/article/details/70238491

    自我最终理解:

    策略模式就是将一个类如类A里面的方法(会变的方法)由具体实现----》抽象为
    一个接口,调用A类的方法时,A类去调用接口的方法(运行时多使得调用接口实现类的方法)。
    这样就将变化的行为解耦出来了(行为变化时加一个行为实现类,这样就不用改这个A类了)



    策略模式最最难理解的问题的答案:
    1、策略模式的缺点是加了策略接口和多个策略类,那这样我们使用策略模式还有什么意义?
    答:如果只是一个行为的话,如我们例子中的只有一个方法say()。确实没有意义。
    计算一下:
    不使用策略:
    当say方法变化时,我们就加一个实现类。变化10次加10个实现类
    使用策略:
    当say方法变化时,加一个SayBehavior接口的实现类,变化10次加10个,因为相对于不使用策略我们加了策略接口,所以还要麻烦点但是如果有两个行为的话,如say,move ,每个方法有十种不同的实现,那么不使用策略要加100个实现类

    使用策略模式只要20个策略类,
    如果3个行为,那么分别是1000个实现类, 30个策略类
    ...

    不用策略模式:
    如果say() move ()方法任一个变化时,我们就要增加一个实现类去实现;那么需要很多类;

    使用了策略模式:
    say() move()方法的具体实现剥离了出来,每次say(),move()方法变化,直接创建一个say的实现类或者move的实现类
    不用策略模式:

    示例代码:

    public abstract class Duck {
        public void say() {
            System.out.println("gaga"); 
        }
        
        public void move() {
            System.out.println("I^m swimming");
        }
    }

    使用策略模式:

    package Test;
    
    public class Client {
    
    public static void main(String[] args) {
    //正常的鸭子
    Duck duck1=new Duck();
    duck1.setSayBehavior(new SayBehaviorImpl1());
    duck1.setMoveBehavior(new MoveBehaviorImpl1());
    duck1.say();
    duck1.move();
    
    //哦是鸭(哦,是呀//鹅是鸭)
    Duck duck2 =new Duck();
    duck2.setSayBehavior(new SayBehaviorImpl2());
    duck2.setMoveBehavior(new MoveBehaviorImpl2());
    duck2.say();
    duck2.move();
    
    }
    }
    
     
    
     
    
    //鸭子父类
    public class Duck {
    private SayBehavior sayBehavior;
    private MoveBehavior moveBehavior;
    
    public void say() {
    sayBehavior.say();
    }
    
    public void move() {
    moveBehavior.move();
    }
    
    public SayBehavior getSayBehavior() {
    return sayBehavior;
    }
    
    
    public void setSayBehavior(SayBehavior sayBehavior) {
    this.sayBehavior = sayBehavior;
    }
    
    public MoveBehavior getMoveBehavior() {
    return moveBehavior;
    }
    
    public void setMoveBehavior(MoveBehavior moveBehavior) {
    this.moveBehavior = moveBehavior;
    }
    }
    
    //说行为策略接口
    public interface SayBehavior {
    void say();
    }
    
    //移动行为的策略接口
    public interface MoveBehavior {
    void move();
    }
    //移动策略实现1
    public class MoveBehaviorImpl1 implements MoveBehavior{
    @Override
    public void move() {
    System.out.println("I^m swimming");
    }
    }
    //移动策略实现2
    public class MoveBehaviorImpl2 implements MoveBehavior{
    @Override
    public void move() {
    System.out.println("I^m fly");
    }
    }
    //说策略实现1
    public class SayBehaviorImpl1 implements SayBehavior{
    @Override
    public void say() {
    System.out.println("gaga");
    }
    }
    //说策略实现2
    public class SayBehaviorImpl2 implements SayBehavior{
    @Override
    public void say() {
    System.out.println("eee...");
    }
    }
    

      

  • 相关阅读:
    桃花扇
    望故乡
    Unity资源加载方式总结
    [Spark]-RDD详解之变量&操作
    [Spark]-RDD之创建
    [Spark]-RDD初识
    [Spark]-编译(2.3.1)&部署(YARN-Cluster)
    [Spark]-背景
    [Hive]-常规优化以及执行计划解析
    [转载]线上应用故障排查之一:高memory占用
  • 原文地址:https://www.cnblogs.com/dxwen/p/11796274.html
Copyright © 2011-2022 走看看