美文网首页
设计模式-多态

设计模式-多态

作者: Addy_Zhou | 来源:发表于2017-03-05 15:00 被阅读139次

1.静态语言和动态语言
静态语言,比如Java,是强类型的,在编译时就已经确定好变量的类型,编译器可以做一些性能优化;
动态语言,比如javascript是弱类型的,需要运行时才能真正知道变量的类型,但相对静态语言语法上更灵活;

2.多态
多态的实际含义是:同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果。
javascript弱类型的特性,语言本身就是支持多态的;可以给变量赋任意类型的值;javascript实现多态的例子如下:

var makeSound=function(animal) {
  animal.sound();
};
var Duck=function(){}
Duck.prototype.sound=function(){
  console.log("嘎嘎嘎");
}
var Chicken=function(){}
Chicken.prototype.sound=function(){
  console.log("咯咯咯");
};

makeSound(new Duck());             //嘎嘎嘎
makeSound(new Chicken());        //咯咯咯

静态类型语言在编译时会进行类型匹配检查,所以不能给变量赋予不同类型的值,下面我们尝试把上面让鸭子和鸡叫唤的例子换成Java代码:


public class Duck{
  public void makeSound() {
      System.out.println(“嘎嘎嘎”);
  }
}

public class Chicken {
    public void makeSound(){
       System.out.println("咯咯咯");
    }  
}

public class AnimalSound {
    public void makeSound(Duck duck) {
        duck.makeSound();
    }
}

public class Test {
  public static void main(String args[]) {
      AnimalSound animalSound=new AnimalSound();
      Duck duck=new Duck();
      animalSound.makeSound(duck);
  }
}

我们已经让鸭子可以发出叫声,但如果想让鸡也叫唤,我们发现一件不可能实现的事情,因为AnimalSound类的makeSound方法被我们规定只能接受Duck类型的参数;
某些时候,在享受静态语言类型检查带来的安全性的同时,我们也会觉得被束缚住了手脚。

为了解决这个问题,静态类型的面向对象语言通常被设计为可以向上转型:当给一个类变量赋值时,这个变量的类型既可以使用这个类本身,也可以使用这个类的超类。
我们新创建一个新类型Animal,把Duck对象和Chicken对象的类型隐藏在超类型Animal身后,Duck对象和Chicken对象就可以被交换使用。

我们先创建Animal抽象类,再分别让Duck和Chicken都继承自Animal抽象类


public abstract class Animal {
  abstract void makeSound();
}

public class Chicken extends Animal {
  public void makeSound() {
    System.out.println("咯咯咯");
  }
}

public class Duck extends Animal {
  public void makeSound() {
    System.out.println("嘎嘎嘎");
  }
}

public class AnimalSound {
  public void makeSound( Animal animal) {
    animal.makeSound();
  }
}

public class Test {
  public static void main(String args[]) {
    AnimalSound animalSound=new AnimalSound();
    Animal duck=new Duck();
    Animal chicken=new Chicken();
    animalSound.makeSound(duck);  //输出嘎嘎嘎
    animalSound.makeSound(chicken); //输出咯咯咯
  }
}

多态的思想实际上是把“做什么”和“谁去做”分离开来,要实现这一点,归根结底先要消除类型之间的耦合关系。

相关文章

  • iOS绘图

    ios阶段算法回调多态(观察者模式)把多态真正明白上一大台阶程序设计设计模式if else少出 创建UIBezie...

  • 设计模式-多态

    1.静态语言和动态语言静态语言,比如Java,是强类型的,在编译时就已经确定好变量的类型,编译器可以做一些性能优化...

  • 读书笔记 |《大话设计模式》之设计模式趣谈

    PART1、 前言 TOPIC: 23种设计模式的趣谈 收获 初步理解各种设计模式 通过设计模式理解封装变化、多态...

  • 要点1 Java相关

    1. 熟练掌握Java技术,熟悉面向对象思想,熟悉常用设计模式; 面向对象思想: 继承, 封装, 多态 设计模式:...

  • 总结3

    设计模式 设计模式 就是使用 多态,即继承和实现来实现的,只不过使用在不同场景下的时候,就会体现出不同的设计模式。...

  • 设计模式-建造者模式

    设计模式 设计模式的本质是面向对象设计原则的实际运用,是对类的==封装性==、==继承性==和==多态性==以及类...

  • 一段多态的javascript代码—多态

    一段多态的javascript代码—多态 《javascript设计模式与开发实践》 定义:同一操作作用于不同的对...

  • 原则

    在设计模式上,抽象、继承、多态,是基本概念,设计模式的目的是建立弹性设计,以便维护和应付变化。简单说就是提高软件的...

  • 面向对象、设计模式基础知识

    1 面向对象2 设计模式 1 面向对象 1.1 多态 多态是具有表现多种形态的能力特征,在OO中是指,语言具有根据...

  • 类似——外观模式

    学习Java,有三大特性:封装、多态、继承。 上次说到:学习设计模式,是了解多态这个特性,非常好的一个途径。 另外...

网友评论

      本文标题:设计模式-多态

      本文链接:https://www.haomeiwen.com/subject/avxegttx.html