zoukankan      html  css  js  c++  java
  • 设计模式之一

    设计模式设计出来就是为了让后期维护代码更容易,增加代码的强壮性等好处!

    策略模式

      自己的理解:定义一个算法族,分别分装起来,使他们能互相替换且算法的变换与使用算法的对象相互独立。简单来说是将变化的和不变得分离,对接口编程,不对实现编程(少用继承)。

     

    下面举个例子:

    Joe上班的公司做了一套相当成功的模拟鸭子游戏:SirmDuck。游戏中出现各种鸭子,一遍游泳,一遍呱呱叫。此系统的内部设计使用了标准的OO技术。设计了一个鸭子的超类(SuperDuck)并让各种鸭子继承此类。一天公司要求在水里游泳的鸭子要会飞。Joe毫不犹豫的将SuperDuck中添加了fly()方法。第二天Joe被叫进办公司问道,游戏中的橡皮鸭子在屏幕中飞来飞去。(《Head First 设计模式》里的翻版)

    问题:只要继承了这个超类,都会飞。。而且后期如果加入别的不会叫的鸭子,也要动原始代码?

    解决::利用策略模式。面向接口编程,将变的抽离出来。

    以下是自己写的代码:

     

    /**
    * Created by Administrator on 2018/1/12.
    * 将鸭子的飞的行为分离出来 先写这个行为,具体的怎么飞按照各鸭子的重写
    */
    public interface FlyBehavior {
    void fly();
    }


    /**
    * Created by Administrator on 2018/1/12.
    * 将鸭子的叫的行为分离出来
    */
    public interface MaleBehavior {
    void male();
    }



    public class NoFly implements FlyBehavior {
    @Override
    public void fly() {
    //不会飞
    System.out.println("我不会飞!");
    }

    }




    public class CanFly implements FlyBehavior {
    @Override
    public void fly() {
    //能飞
    System.out.println("我会飞!");
    }
    }



    public class CanMale implements MaleBehavior {
    @Override
    public void male() {
    System.out.println("我会叫,叫起来 吱吱吱");
    }
    }



    public class CanMale1 implements MaleBehavior {
    @Override
    public void male() {
    System.out.println("我会叫 叫起来像 呱呱呱");
    }
    }



    /**
    * Created by Administrator on 2018/1/12.
    * 鸭子的超类,每一个鸭子都要继承这个Duck
    */
    public class Duck {
    //鸭子有两个行为 飞和叫
    FlyBehavior flyBehavior;
    MaleBehavior maleBehavior;

    public Duck(){
    }
    public void flyBehavior(){
    flyBehavior.fly();
    }
    public void maleBehavior(){
    maleBehavior.male();
    }

    public void setFlyBehavior(FlyBehavior flyBehavior) {
    this.flyBehavior = flyBehavior;
    }

    public void setMaleBehavior(MaleBehavior maleBehavior) {
    this.maleBehavior = maleBehavior;
    }
    }



    public class ModulDuck extends Duck {
    //可以在构造函数里去new 对应的行为。。然后在建鸭子的时候 new对应的鸭子即可
    public ModulDuck(){
    flyBehavior=new NoFly();
    // maleBehavior=new
    }
    public void display(){
    System.out.println("我是一只模型鸭子!");
    }
    }

    //测试类
    public class DuckTest {
    public static void main(String[] args){
    Duck duck=new Duck();
    duck.setFlyBehavior(new CanFly());
    duck.setMaleBehavior(new CanMale1());
    duck.flyBehavior();
    duck.maleBehavior();

    Duck duck1=new Duck();
    duck1.setMaleBehavior(new CanMale());
    duck1.setFlyBehavior(new NoFly());
    duck1.flyBehavior();
    duck1.maleBehavior();
    }
    }

     

     

  • 相关阅读:
    Linux_LEMP
    Linux_LEMP
    Linux_指令杂烩
    Linux_指令杂烩
    Linux_SELinux使用
    AWS S3存储基于Hadoop之上的一致性保证
    Ozone数据写入过程分析
    Ozone Datanode的分布式元数据管理
    聊聊Ozone的Topology Awareness
    Ozone数据探查服务Recon的启用
  • 原文地址:https://www.cnblogs.com/xiaohuachen/p/8277299.html
Copyright © 2011-2022 走看看