zoukankan      html  css  js  c++  java
  • JAVA编程心得-多态设计初步

    面向对象的思想中,封装,继承,多态作为特性会在开发中广泛应用,一个健壮的系统除了功能强大以外,它的可扩展性应该也很强,多态恰好应用了这个思路。

    下面我以杨小聪去某地的方式为例,我们知道首先杨小聪要去某地的话需要驾驶交通工具,那么我首先定义一个Driver类负责驾驶

    public class Driver {
    	private String name;
    	
    	
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public void drive(Vihecle v) {
    		v.go(this,new Address("武汉"));
    	}
    	
    }


    上述name代表驾驶员的名字,drive代表如何驾驶,Vihecle代表交通工具,因为我目前还不知道用什么交通工具,所以我们可以把此类定义为抽象,我们知道所有的交通工具都是可以有驾驶的方法,那么GO就作为一个抽象方法,我这里只定义它为抽象方法,没有具体实现,仅仅把驾驶员的信息与目的地址当参数传入。

    public abstract class Vihecle {
    	public abstract void go(Driver d,Address dest);
    }


    既然由驾驶员Driver ,驾驶方法drive,驾驶的交通工具Vihecle,那么接下来就需要定义目的地址了Address,name代表目的名称

    public class Address {
    	private String name;
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public Address(String name) {
    		super();
    		this.name = name;
    	}
    	
    }


    接下来我们就可以定义实际交通工具类了,这里我以汽车Car,与飞机Plane两个类为例。这两个类同时都继承了交通工具Vihecle,那么我在实际调用中就可以不用多次传值了。

    public class Car extends Vihecle{
    	public void go(Driver d,Address dest) {
    		System.out.println(d.getName()+"开车去" + dest.getName());
    	}
    }
    public class Plane extends Vihecle{
    	@Override
    	public void go(Driver d, Address dest) {
    		// TODO Auto-generated method stub
    		System.out.println(d.getName()+"坐飞机去" + dest.getName());
    	}
    }


    最后我们可以写一个测试类来测试结果

    public class Test {
    	public static void main(String[] args) {
    		Driver d = new Driver();
    		d.setName("杨小聪");
    		d.drive(new Car());
    		d.drive(new Plane());
    	}
    }


    输出结果:

    杨小聪开车去武汉
    杨小聪坐飞机去武汉


    总结:

    其实我们也可以在Driver类中按交通工具每个类来定义方法,但是这样的设计思路不够灵活每次去还要修改这一层的代码。将开车的方式抽象化,我们站在客户的立场上为他们设计,客户想要开车我们就将对应车的对象传入,这样的方式扩展性很强,如果他还想做火车,我们重新定义一个火车类来继承Vihecle,Driver部分我们不需要修改任何逻辑。

    多态的三个特性,有继承,有重写,有父类的引用指向子类的对象。



  • 相关阅读:
    MySQL for OPS 02:SQL 基础
    Samba:基于公网 IP 的服务访问
    MySQL for OPS 01:简介 / 安装初始化 / 用户授权管理
    Samba:打造企业级授权文件共享服务器
    嵌入式web server——Goahead移植要点
    libConfuse的使用
    【工具篇】notepad++
    使用sprintf打印float并控制小数位数时引起的问题
    【工具篇】source Insight
    【工具篇】xshell
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3293834.html
Copyright © 2011-2022 走看看