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...");
    }
    }
    

      

  • 相关阅读:
    Java 泛型 泛型的约束与局限性
    Java 泛型 泛型方法
    Java 泛型 泛型数组
    Java 泛型 协变性、逆变性
    Java 泛型 协变式覆盖和泛型重载
    Java 泛型 泛型代码和虚拟机
    Insertion Sort List
    Remove Duplicates from Sorted List II
    String to Integer (atoi)
    SpringMvc源码入门
  • 原文地址:https://www.cnblogs.com/dxwen/p/11796274.html
Copyright © 2011-2022 走看看