• 设计模式一:策略模式


    目的:提高代码的复用性,拓展性,降低代码间的耦合度。

    示例:就以鸭子举例

    1.将类之间的共性定义在父类之中。

    鸭子都会游泳

    public abstract class Duck {
        public void swim(){
            System.out.println("游泳!");
        }
    }
    

      

    2.将子类一定有的功能(不同子类实现方式不一样)写成抽象方法在父类中。

    不同鸭子颜色不一样

    public abstract class Duck {
        public void swim(){
            System.out.println("游泳!");
        }
        abstract void showColor();
    }

    3.将子类不一定有的方法单独写成接口。

    比如不是所有鸭子都会飞(比喻不太恰当,理解含义就行)

    public interface QuackBehavior {
        void quack();
    }
    public interface JumpBehavior {
        void jump();
    }
    

      

    4.将步骤3中的接口作为成员属性放在父类中。

    数据摆放顺序是按照步骤摆的,为了方便理解,实际读者在写代码的时候不要写这种顺序。

    public abstract class Duck {
        public void swim(){
            System.out.println("游泳!");
        }
        abstract void showColor();
    
        FlyBehavior flyBehavior;
        JumpBehavior jumpBehavior;
    
        public void performFly(){
            flyBehavior.fly();
        }
        public void performJump(){
            jumpBehavior.jump();
        }
    }
    

      

      

    5.针对独立出来的接口写具体的实现类。

    public class FlyWithWing implements FlyBehavior {
        public void fly() {
            System.out.println("用翅膀飞!");
        }
    }
    public class JumpWithOneLeg implements JumpBehavior {
        public void jump() {
            System.out.println("用一只脚跳!");
        }
    }
    

      

      

    6.创建我们需要的具体实现类,继承父类,在构造函数中指定需要功能的具体实例,实现特色功能。

    public class RedDuck extends Duck{
        public RedDuck(){
            flyBehavior = new FlyWithWing();
         jumpBehavior = new JumpWithOneLeg(); } public void showColor() { System.out.println("red!"); } }

    7.测试demo

    public class Test {
        public static void main(String...args){
            Duck duck = new RedDuck();
            duck.performFly();
    duck.performJump(); duck.swim(); ((RedDuck) duck).showColor(); } }

    1.假设现在我们多了一个鸡的对象,可以直接将飞和跳的能力用上,因为这些行为是与鸭子解耦的。增加了代码的复用性。

    2.假设现在多了一种行为,鸡会唱歌,那么我们完全可以写一个唱歌的行为,不会对目前已有的鸭子对象造成影响。

    END

  • 相关阅读:
    java中getResourceAsStream的问题 缓存
    springside 查询条件
    如何修改MySQL数据库引擎为INNODB
    获取用户真实 IP , 淘宝IP接口获得ip地理位置
    hibernate注解的CascadeType属性
    AssignmentHandler实现类用spring注入
    使用 jQuery dataTables
    转载:一致性 hash 算法( consistent hashing )
    转载:memcached完全剖析
    转载:连接MySQL数据库的两种方式介绍
  • 原文地址:https://www.cnblogs.com/indecy/p/10568886.html
Copyright © 2020-2023  润新知