面向对象-duck

package oo;

public interface Duck {
    public void fly();

public void quack();
}

package oo;

public class MallardDuck implements Duck {
    public void fly()
    {
        System.out.println("I‘m flying");
    }
    public void quack()
    {
        System.out.println("Quack");
    }

}

package oo;

public interface Turkey {
    public void gobble();
    public void fly();

}

package oo;

public class WildTurkey implements Turkey{
    public void gobble()
    {
        System.out.println("Gobble gobble");
    }
    public void fly()
    {
        System.out.println("I‘m flying a short distance");
    }

}

package oo;

import java.util.Random;

public class DuckAdapter implements Turkey{
Duck duck;
Random rand;

public DuckAdapter(Duck duck)
{
    this.duck=duck;
    rand=new Random();
}
public void gobble()
{
    duck.quack();
}
public void fly()
{
    if (rand.nextInt(5)==0)
    {
        duck.fly();
    }
}
}

package oo;

public class TurkeyAdapter implements Duck{
Turkey turkey;
public TurkeyAdapter(Turkey turkey)
{
    this.turkey=turkey;
}
public void quack()
{
    turkey.gobble();
}
public void fly()
{
    for (int i=0;i<5;i++)
    {
        turkey.fly();
    }
}
}

package oo;

public class DuckTestDrive {
public static void main(String[]args)
{
    MallardDuck duck=new MallardDuck();
    WildTurkey turkey=new WildTurkey();
    Duck turkeyAdapter=new TurkeyAdapter(turkey);
    System.out.println("the turkey says..");
    turkey.gobble();
    turkey.fly();
    System.out.println("the duck says..");
    test(duck);
    System.out.println("the turkeyadapter says..");
    test(turkeyAdapter);
}

static void test(Duck duck)
{
    duck.quack();
    duck.fly();
}
}

package oo;

public class TurkeyTestDrive {
public static void main(String []args)
{
    MallardDuck duck=new MallardDuck();
    Turkey duckAdapter=new DuckAdapter(duck);
    for(int i=0;i<10;i++)
    {
        System.out.println("the duckadapter says..");
        duckAdapter.gobble();
        duckAdapter.fly();
    }
}
}

时间: 2024-08-24 11:57:30

面向对象-duck的相关文章

从面向过程到面向对象

改变思维 曾经在学校学习数据结构课程时,第一节课上,老师就告诉我们:程序=数据结构+算法.这句话对我后来学习数据结构起了很大的作用,积极的作用. 可是后来学到C++面向对象部分时,这句话让我在有些地方怎么也想不通.想了很久之后,我得出了另一个结论,在面向对象程序中,程序=对象&行为.这里我使用&,是为了说明对象与行为是关系的.行为是对象的行为,对象要对它自己的行为负责. 这种思维上的转换在从PO到OO的过程中非常重要,下面我举个例子: 假如使用PO的思维,我们想要实现"兔子走路&

Duck typing

第一次了解到这个词汇是我在知乎提了一个问题,知乎传送地址. vczh在答案中提到了duck type,于是google了一番,大概了解了一下,附上wiki地址. 在面向对象的编程语言中,所谓的duck type是指:对象的属性和方法决定了类的语义,而不是它的继承关系或者是它实现了某个接口.这个概念最早是由James Whitcomb Riley提出的,下面这句话可以帮助我们理解: When I see a bird that walks like a duck and swims like a

Day_18.《JavaScript设计模式与开发实践》-面向对象的JavaScript

设计模式 面向对象 动态类型语言 编程语言按照数据类型大体分为:静态类型语言和动态类型语言. 静态类型语言在编译时便已确定变量的类型,而动态类型语言的变量类型要到程序运行时,待变量被赋予某个值之后,才会具有某种类型. 在JavaScript中,当我们对一个变量赋值时,显然不需要考虑它的类型,因此JavaScript是一门典型的动态类型语言. 动态类型语言对变量类型的宽容给实际编码带来了很大的灵活性,由于无需进行类型检测,我们可以尝试调用任何对象的任意方法,而无需去考虑它原本是否被设计为拥有该方法

Python:面向对象的“开闭原则”和“鸭子类型”

开闭原则 开闭原则(OCP)是面向对象设计中"可复用设计"的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段. 1988年,勃兰特·梅耶(Bertrand Meyer)在他的著作<面向对象软件构造(Object Oriented Software Construction)>中提出了开闭原则,它的原文是这样:"Software entities should be open for extension,but closed fo

面向对象基础3(class0523)

怎么实现多态2-接口 接口是定义一种能力,规定子类能干什么和抽象类有些相似,解决类的单根继承.接口可以实现多继承 案例 鸟-麻雀sparrow,鸵鸟ostrich,企鹅penguin,鹦鹉parrot 鸟能飞鸵鸟,企鹅不能...你怎么办 练习:从学生,老师,父类Person,定义一个接口摄影Iphotographable ,唱歌的接口ISingable 子类继承抽象类,实现接口 接口中的成员必须不能有实现 接口中的成员不能有访问修饰符,隐式公开 接口中可以有属性.方法.索引器等,但不能有字段,构

设计模式学习笔记(一)——面向对象设计模式与原则

1.设计模式的概念 设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案. 2.面向对象设计模式 面向对象设计模式描述了类与相互通信的对象之间的组织关系.目的是应对变化.提高复用.减少改变. 3.什么是对象: 1)从概念层面讲,对象是某种拥有职责的抽象: 2)从规格层面讲,对象是一系列可以被其他对象使用的公共接口: 3)从语言实现层面来看,对象封装了代码和数据(也就是行为和状态).如果我们抛开代码的实现来看对象的概念,那么它应该就像个具体的物体,比如说:榔头,从概念层面讲,榔头有它的职责

JavaScript设计模式与开发实践 面向对象

1 动态类型语言 静态类型语言编译时就已经确定变量类型,动态类型语言的变量类型要到程序运行时,变量被赋予某个值后,才会有类型. 静态语言的优点:首先,编译时就能发现类型不匹配错误,其次如果程序明确规定数据类型,编译器还能针对这些信息对程序进行优化,提高程序执行速度.   静态语言的缺点:迫使程序员按照强契约编写程序,并且增加更多代码. 动态语言的优点:编写的代码更少,程序员能把精力放到业务逻辑. 动态语言的缺点:无法保证变量的类型,再程序运行时可能发现类型相关错误. 动态类型无需进行类型检测,我

python之面向对象编程浅谈

1.python中的类与对象 1 Python中定义类的方式比较简单: 2 3 class 类名: 4 5 类变量 6 7 def __init__(self,paramers): 8 9 def 函数(self,...) 10 11 …... 12 13 其中直接定义在类体中的变量叫类变量,而在类的方法中定义的变量叫实例变量.类的属性包括成员变量和方法,其中方法的定义和普通函数的定义非常类似,但方法必须以self作为第一个参数. 举例: 1 >>>class MyFirstTestCl

nim和面向对象(一)

Nim and OO 原文链接:http://goran.krampe.se/2014/10/29/nim-and-oo/ 作者:Roads less Taken A blend of programming, boats and life. 时间:2014,10,29 Nim is presented as an imperative language. And yes, it has some of its roots in the Pascal line of languages, but