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部分我们不需要修改任何逻辑。

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



  • 相关阅读:
    ubuntu安装jdk的两种方法
    LeetCode 606. Construct String from Binary Tree (建立一个二叉树的string)
    LeetCode 617. Merge Two Binary Tree (合并两个二叉树)
    LeetCode 476. Number Complement (数的补数)
    LeetCode 575. Distribute Candies (发糖果)
    LeetCode 461. Hamming Distance (汉明距离)
    LeetCode 405. Convert a Number to Hexadecimal (把一个数转化为16进制)
    LeetCode 594. Longest Harmonious Subsequence (最长的协调子序列)
    LeetCode 371. Sum of Two Integers (两数之和)
    LeetCode 342. Power of Four (4的次方)
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3293834.html
Copyright © 2011-2022 走看看