zoukankan      html  css  js  c++  java
  • head first 设计模式笔记1-策略模式:模拟鸭子

    1、第一个设计原则:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。该原则几乎是所有设计模式背后的精神所在。

      这个原则的另一种思考方式:把会变化的部分取出并封装起来,以便以后可以轻易改动或扩充此部分,二不影响不需要变化的其他部分。

    2、第二个设计原则:针对接口编程,而不是针对实现编程。

    3、第三个设计原则:多用组合,少用继承

    4、策略模式(Strategy Pattern):模拟鸭子

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

      Duck(鸭子抽象类,组合了 FlyBehavior 和 QuackBehavior)

    public abstract class Duck {
        // 关系 has a
        protected FlyBehavior flyBehavior;// 封装飞行行为
        protected QuackBehavior quackBehavior;// 封装呱呱叫行为
        
        public void performFly() {
            flyBehavior.fly();
        }
        public void performQuack() {
            quackBehavior.quack();
        }
        
        // 动态设定行为
        public void setFlyBehavior(FlyBehavior flyBehavior) {
            this.flyBehavior = flyBehavior;
        }
        public void setQuackBehavior(QuackBehavior quackBehavior) {
            this.quackBehavior = quackBehavior;
        }
    
        public void swim() {
            System.out.println("所有的鸭子都会游泳");
        }
    
        public abstract void display();
    }

      飞行行为(算法)

    public interface FlyBehavior {
        void fly();
    }
    public class FlyWithWings implements FlyBehavior {
        @Override
        public void fly() {
            System.out.println("哈哈。我有翅膀,我会飞。。。");
        }
    }
    public class FlyNoWay implements FlyBehavior {
        @Override
        public void fly() {
            System.out.println("什么都不做,不会飞");
        }
    }

      呱呱叫行为(算法)

    public interface QuackBehavior {
        void quack();
    }
    public class Quack implements QuackBehavior {
        @Override
        public void quack() {
            System.out.println("呱呱叫");
        }
    }
    public class Squeak implements QuackBehavior {
        @Override
        public void quack() {
            System.out.println("吱吱叫");
        }
    }
    public class MuteQuack implements QuackBehavior {
        @Override
        public void quack() {
            System.out.println("什么都不做,不会叫");
        }
    }

      MallardDuck(一种具体的鸭子类,初始化了 flyBehavior 和 quackBehavior)

    public class MallardDuck extends Duck {
        
        public MallardDuck() {
            this.flyBehavior = new FlyWithWings();
            this.quackBehavior = new Quack();
        }
    
        @Override
        public void display() {
            System.out.println("MallardDuck display");
        }
    
    }

      

      测试:

    public class Demo02 {
        public static void main(String[] args) {
            Duck duck = new MallardDuck();
            duck.performFly();
            duck.performQuack();
            duck.swim();
            duck.display();
    System.out.println(
    "=========动态改变行为========="); duck.setFlyBehavior(new FlyNoWay()); duck.setQuackBehavior(new MuteQuack()); duck.performFly(); duck.performQuack(); } }

      打印结果:

    哈哈。我有翅膀,我会飞。。。
    呱呱叫
    所有的鸭子都会游泳
    MallardDuck display
    =========动态改变行为=========
    什么都不做,不会飞
    什么都不做,不会叫

    5、总结

    1)"有一个"关系:每一个鸭子都有一个 FlyBehavior 和 QuackBehavior,好将飞行和呱呱叫委托给它们代为处理。

      当你将两个类结合起来使用,就是组合(Composition)。这种做法与“继承”不同的在于,鸭子的行为不是继承来的,而是和适当 行为对象"组合"来的。

    2)软件开发完成"前"以及完成"后",何者花费更多时间?

      "后"。我们总需要花许多时间在系统的维护和变化上,比原先开发所花的时间更多。所以,我们应该致力于提高软件的可维护性和可扩展性

  • 相关阅读:
    ELK 安装与配置
    redis参数与持久化原理
    python_way ,day26 django_admin 自定义
    python_way ,day25 wmi
    docker系列详解<一>之docker安装
    SpringCloud学习系列<一>版本介绍
    docker 安装MongoDB以及设置用户
    Caused by: java.lang.IllegalArgumentException
    tomcat启动时间5分钟左右org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [342,445] milliseconds.
    Spring 全局异常拦截根据业务返回不同格式数据 自定义异常
  • 原文地址:https://www.cnblogs.com/xy-ouyang/p/11372399.html
Copyright © 2011-2022 走看看