首先,我们来看一个简单的例子,我们用必胜客的pizza来做个例子
首先定义一个interface,抽象出生产比萨的过程。
Pizza.java
- public interface Pizza {
- public void prepare();
-
- public void bake();
-
- public void cut();
-
- public void box();
- }
然后由各种具体的pizza实现它
香荤至尊比萨
MeatPizza.java
- public class MeatPizza implements Pizza {
- public void prepare() {
- System.out.println("香荤至尊开始准备了");
- }
-
- public void bake() {
- System.out.println("香荤至尊开始烘烤");
- }
-
- public void cut() {
- System.out.println("香荤至尊切咯");
- }
-
- public void box() {
- System.out.println("香荤至尊打包");
- }
-
- }
金枪鱼比萨
TunaPizza.java
- public class TunaPizza implements Pizza {
- public void prepare() {
- System.out.println("金枪鱼开始准备了");
- }
-
- public void bake() {
- System.out.println("金枪鱼开始烘烤");
- }
-
- public void cut() {
- System.out.println("金枪鱼切咯");
- }
-
- public void box() {
- System.out.println("金枪鱼打包");
- }
- }
夏威夷比萨
HawaiianPizza.java
- public class HawaiianPizza implements Pizza{
- public void prepare() {
- System.out.println("夏威夷开始准备了");
- }
-
- public void bake() {
- System.out.println("夏威夷开始烘烤");
- }
-
- public void cut() {
- System.out.println("夏威夷切咯");
- }
-
- public void box() {
- System.out.println("夏威夷打包");
- }
- }
我们利用多态为我们提供的接口与实现分离,改善程序的组织架构及可读性
下边的代码我们可以看到我们完全可以忘记掉对象类型(type)
- public class Test {
- public static Pizza orderPizza (String type){
- Pizza pizza = null;
- if (type.equals("Meat"))
- pizza = new MeatPizza();
- else if (type.equals("Tuna"))
- pizza = new TunaPizza();
- else if (type.equals("Hawaiian"))
- pizza = new HawaiianPizza();
- pizza.prepare();
- pizza.bake();
- pizza.cut();
- pizza.box();
- return pizza;
- }
- public static void main(String[] args) {
- System.out.println("金枪鱼比萨");
- Test.orderPizza("Tuna");
- System.out.println("香荤至尊比萨");
- Test.orderPizza("Meat");
- System.out.println("夏威夷比萨");
- Test.orderPizza("Hawaiian");
- }
- }
在这里,我先把这个程序的执行结果帖上,看能不能理解
金枪鱼比萨
金枪鱼开始准备了
金枪鱼开始烘烤
金枪鱼切咯
金枪鱼打包
香荤至尊比萨
香荤至尊开始准备了
香荤至尊开始烘烤
香荤至尊切咯
香荤至尊打包
夏威夷比萨
夏威夷开始准备了
夏威夷开始烘烤
夏威夷切咯
夏威夷打包
可能大家无法理解编译器如何知道这个reference(引用)指向的是derived class而不是base class呢?其实编译器是不知道的,其实是binding的缘故,而且是执行期绑定(run-time binding)
这就是多态性的一个重要方面——向上转型(upcasting)
我为什么要给出这个例子呢?还有别的用途,就是想说明一种设计模式——工厂模式
这个例子给出了一个工厂方法,orderPizza,借助这个方法可以生成不同的对象
分享到:
相关推荐
第一部分给出了实现具体设计模式所需要的面向对象特性的基础知识,主要包括接口、封装和信息隐藏、继承、单体模式等内容。第二部分则专注于各种具体的设计模式及其在JavaScript语言中的应用,主要介绍了工厂模式、...
在JavaScript这种基于原型的语言中,单体模式有其特定的实现方式,既与传统面向对象语言中的单体模式有所不同,也具有独特的实现技巧和考量。 ### 单体模式在传统面向对象语言中的实现 传统面向对象语言的单体模式...
面向对象系统中功能复用的两种最常用技术是类继承和对象组合,以便提高软件的效率和可维护性。 29. 只根据抽象类中定义的接口来操纵对象有什么好处? 只根据抽象类中定义的接口来操纵对象可以提高软件的灵活性和可...
1. 创建型模式:如单例模式(Singleton)、工厂方法模式(Factory Method)和建造者模式(Builder),它们关注对象的创建过程,使得代码更加灵活和易于管理。 2. 结构型模式:包括适配器模式(Adapter)、装饰器...
第一部分给出了实现具体设计模式所需要的面向对象特性的基础知识,主要包括接口、封装和信息隐藏、继承、单体模式等内容。第二部分则专注于各种具体的设计模式及其在JavaScript语言中的应用,主要介绍了工厂模式、...
面向对象设计是软件工程中的核心概念,它是在分析模型的基础上,通过使用面向对象技术来创建设计模型,以解决如何将需求转化为实际软件的过程。在这一过程中,设计主要包括系统设计、详细设计、用户界面设计和设计...
Go语言设计模式是Go编程中的一种重要思想,它源于面向对象设计,并在Go语言的上下文中得到独特的诠释。设计模式是解决软件开发中常见问题的经验总结,为代码组织和复用提供了一套标准的解决方案。这两本书《Go ...
5. **面向对象编程**:作为主流的编程范式,面向对象强调封装、继承和多态,有助于构建模块化的软件系统。 6. **编程规范与文档**:遵循一定的编码规范可以提高代码的可读性,同时,详尽的项目文档能确保团队间的...
"设计模式"一词起源于Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides的著作《设计模式:可复用面向对象软件的基础》。常见的设计模式有"桥接模式"用于解耦抽象和实现,"装饰器模式"用于动态地添加或修改...
设计模式如工厂模式、观察者模式和装饰器模式等,为开发者提供了经过验证的解决方案,可以提高代码质量和可维护性。 此外,软件设计与体系结构还需要考虑软件质量属性,如性能、安全性和可靠性。性能优化可能涉及到...
面向对象设计(OOD)是软件工程的一种方法,它基于类和对象的概念,强调封装、继承和多态性。在面试中,以下是一些常见的OOD问题: 1. **设计模式**:理解并能应用各种设计模式,如工厂模式、单例模式、观察者模式...
3. **面向对象设计**:讲解面向对象编程(OOP)的基本概念,包括类、对象、封装、继承、多态。此外,还会讨论如何进行有效的类设计,包括接口设计、抽象类和具体类的选择,以及如何使用继承和组合来构建复杂系统。 ...
了解封装、继承和多态这三大面向对象特性。 4. **方法**:方法是实现特定功能的代码块,可以被其他代码调用。 5. **数组**:用于存储同一类型的数据集合,可以是一维、二维或多维。 6. **异常处理**:通过try-...
4. **23种设计模式**:这些模式是软件工程中经过实践验证的最佳实践,如工厂模式、单例模式、建造者模式、观察者模式、装饰器模式等。掌握这些模式有助于写出更优雅、更易于维护的代码。 5. **数据库**:数据库是...
“Java”则表明后端编程语言选择了Java,这是一种广泛应用于企业级应用的面向对象语言,具有丰富的库和框架支持。 根据【压缩包子文件的文件名称列表】"CQIPC_Graduation_App-main"来看,这可能是项目的主要代码...
5. 面向对象设计:在系统设计中,面向对象方法是主流,强调对象的封装、继承和多态。通过创建类和对象,设计师可以构建出具有复用性和扩展性的软件系统。 6. 数据库设计:系统设计中数据库的设计至关重要,包括概念...
考生需了解各种设计原则和模式,如 SOLID 原则,以及面向对象设计思想。 四、编程基础与语言特性 虽然软件工程考试通常不直接考察编程能力,但编程语言的基本概念和语法特性是必备知识。试卷可能涉及常见编程语言如...
3. **软件设计原则**:如模块化、面向对象设计、设计模式等,以及相关的英文描述和术语。 4. **软件架构**:涵盖常见的软件架构模式,如微服务、单体架构、事件驱动等,以及如何用英文表述这些概念。 5. **开发...