• JAVA设计模式一策略模式(Strategy Pattern)


    什么是设计模式?

    就是一些经验。让程序代码更具弹性、好维护、代码复用的经验。而且设计模式都遵从一些OO设计原则。

    题外话:以下罗列出常用的OO设计原则:链接

    本文章介绍策略模式(Strategy Pattern)。

    一、定义:

      定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

    二、用到的设计原则:

    1 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起

    一般情况下,稳定的部分利用继承,变化的部分利用接口。

    1 针对接口编程,而不是针对实现编程。

    // Animal是一个接口  Dog 类实现了Animal接口
    //针对实现编程
    Dog d=new Dog();
    //针对接口编程
    Animal animal=new  Dog();

    2 多用组合,少用继承。

    某一个具体类的行为,不通过继承父类获得,也不通过直接实现接口获得。而是把接口作为变量定义在该具体类中,如果该具体类想要使用这个行为。
    在调用这个具体类的时候,set这个接口的具体实现类对象进去,即可获得想要的行为。

    三、例子:

    题目:公司做了一套模拟鸭子的游戏:呱呱。游戏中会出现各种鸭子,一遍游泳戏水,一边呱呱叫。公司要求,让部分鸭子可以飞翔。鸭子的叫法各不相同,鸭子的飞翔姿势各不相同。试问,如何设计?

    public abstract Class Duck{
    
    //组合 FlyBehavior flyBehavior ; QuackBehavior quackBehavior;
    public Duck(){} public void setFlyBehavior(FlyBehavior fb){ flyBehavior =fb; } public void setQuackBehavior(QuackBehavior qb){ quackBehavior=qb; }

    public void performFly(){
    flyBehavior.fly();

    }

    public vod perfromQuack(){
    quackBehavior.quack();
    }
    //稳定部分的代码在这里直接实现就好,直接让子类继承,提高代码复用。
    //抽象类真的就是生来被用来继承的。为什么变化的部分不在这里写一个抽象方法,
    //因为,写接口是为了复用。
    
    }
    
    }

    public class GreenDuck extends Duck{
    
        public GreenDuck(){}
    
        public void display(){
    
            System.out.println("我是一只绿鸭子!!!");
       }
    }
    public interface FlyBehavior{
         public void fly(){};
    }
    
    public class Fly1 implements FlyBehavior{
    
        public void fly(){
             System.out.println("我正在用第一种方式飞翔!!!");
        }
    }
    
    
    public class Fly2 implements FlyBehavior{
    
        public void fly(){
             System.out.println("我正在用第二种方式飞翔!!!");
        }
    }
    public interface QuackBehavior{
         public void quack(){};
    }
    
    public class Quack1 implements QuackBehavior{
    
        public void quack(){
             System.out.println("我正在用第一种方式叫!!!");
        }
    }
    
    
    public class Quack2 implements QuackBehavior{
    
        public void quack(){
             System.out.println("我正在用第二种方式叫!!!");
        }
    }
    

      

    public class Test{
         
        public static void main(String[] args){
           //接口编程
           Duck duck=new GreenDuck();
           //组合的调用
           duck.setFlyBehavior(new Fly1());
    
           duck.performFly();
       }
    
    
    }

    四、个人理解:以上。

  • 相关阅读:
    JavaScript——闭包(转自别人)
    JavaScript ——内部函数和匿名函数
    socks5代理服务器ss5配置
    TCP部首长度定义
    九个Console命令,让js调试更简单
    一位前端新手入住博客园
    动画库 Tweenmax 使用示例1
    Dijkstra算法实例
    N皇后问题
    华为精益研发外包 PDF
  • 原文地址:https://www.cnblogs.com/haiqin/p/9111439.html
Copyright © 2020-2023  润新知