• 设计模式——(一)策略模式


    1. 定义

    策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

    1. 设计原则

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

        说明:Duck原来的中fly(),quack()方法随着duck种类不同,可能会不同,如果变一个种类的duck就继承并覆盖实现自己的fly()方法,让所有需要quack()和fly()方法的鸭子都去重复实现这两个方法的功能,那么就这么几个鸭子还好说,但是如果我们有几十、上百个鸭子的时候怎么办?如果某个方法要做一点修改,难道要重复修改上百遍吗?

      2. 面向接口编程,而不要面向实现编程.
      3. 多用组合,少用继承

        接口可以是抽象类和实际接口。

        接口Duck把接口FlyBehaviorQuackBehavior组合在一起。

      public abstract class Duck {

          FlyBehavior flyBehavior;

          QuackBehavior quackBehavior;

          public Duck() {

              

          }

          public void performFly(){

              flyBehavior.fly();//接口

          }

          public void performQuack(){

              quackBehavior.quack();//接口

          }

          public void swim(){

              System.out.println("all ducks float");

          }

      }

      public class MallardDuck extends Duck {

          public MallardDuck(){

              quackBehavior = new Quack();

              flyBehavior = new FlyWithWings();

          }

          public void display(){

              System.out.println("MallardDuck");

          }

      }

        public class MiniDuckSimulator {

        public static void main(String[] args){

            Duck mallard = new MallardDuck();//接口

            mallard.performQuack();

            mallard.performFly();

        }

    }

     

    3.应用File类的list()方法

    编程思想第18章

    public class DirList {

        public static void main(String[] args) {

            // TODO Auto-generated method stub

            File path = new File(".");

            String[] list;

            if(args.length == 0)

                list= path.list();

            else

                list = path.list((FilenameFilter) new DirFilter(args[0]));

            for(String dirItem: list){

                System.out.println(dirItem);

            }

        }

    }

     

    在高亮标记的部分,list()方法的输入参数是以接口(filenameFilter)形式,list()可以回调accept()方法。

    1. 将变化的部分,采用接口封装

      如FilenameFilter的accept()方法,和FlyBehavior的fly()方法…

    public interface FilenameFilter {

        boolean accept(File dir, String name);

    }

     

    public interface FlyBehavior {

        public void fly();

    }

  • 相关阅读:
    thymeleaf 模板使用 之 解决因HTML标签未闭合引起的错误
    Spring MVC 拦截器
    Spring boot data jpa 示例
    Hibernate 数据库方言
    Springboot 之 静态资源路径配置
    Java 时间不一致
    IntelliJ IDEA 2017.3.2 热加载(Hot Swap)
    IntelliJ IDEA Spring boot devtools 实现热部署
    Python-集合
    Python-文件读写及修改
  • 原文地址:https://www.cnblogs.com/thehappyyouth/p/3679705.html
Copyright © 2020-2023  润新知