package cn.edu.ThinkInOO; public class Test1 { public static void main(String[] args) { System.out.println("老张开车去东北"); } }
package cn.edu.ThinkInOO; public class Test2 { public static void main(String[] args) { String driverName="老张"; String vehicle="车"; String tergetPlace="东北"; System.out.println(driverName+"开"+vehicle+"去"+tergetPlace); } }
package cn.edu.ThinkInOO; public class Test2 { public static void main(String[] args) { String driverName="老张"; String vehicle="车"; String tergetPlace="东北"; go( driverName,vehicle,tergetPlace); } public static void go(String driverName,String vehicle,String tergetPlace){ System.out.println(driverName+"开"+vehicle+"去"+tergetPlace); } }这样设计真的可以吗?答案肯定是否定的。
package cn.edu.ThinkInOO; public class Driver { }Car.java:
package cn.edu.ThinkInOO; public class Car { }Address.java:
package cn.edu.ThinkInOO; public class Address { }
定义完类之后,我们需要为每一个类定一些属性,对于任何一个类,都不能脱离具体的应用环境,
要根据具体的应用环境去顶我们的属性,跟我们没关系的属性我们不要去封装。
下面是这三个类的属性封装:package cn.edu.ThinkInOO; public class Driver { String DriverName; }
package cn.edu.ThinkInOO; public class Car { String carType; }
package cn.edu.ThinkInOO; public class Address { String addressName; }
package cn.edu.ThinkInOO; public class Driver { String DriverName; public void driver(){ } }
package cn.edu.ThinkInOO; public class Car { String Type; public void go(){ } }
package cn.edu.ThinkInOO; public class Car extends Vihecle{ private String Type; public String getType() { return Type; } public void setType(String Type) { this.Type = Type; } public void go(Address dest){ } }Driver.java:
package cn.edu.ThinkInOO; public class Driver { private String DriverName; public String getDriverName() { return DriverName; } public void setDriverName(String driverName) { DriverName = driverName; } public void driver() { } }Address.java:
package cn.edu.ThinkInOO; public class Address { private String addressName; public String getAddressName() { return addressName; } public void setAddressName(String addressName) { this.addressName = addressName; } }
package cn.edu.ThinkInOO; public class Travel { public static void main(String[] args) { Driver d=new Driver(); d.setDriverName("老张"); d.driver(); } }
写到这,就要考虑司机和车的关系了,driver老张和Car车如何联系?这就考虑类与类之间的关系了。
package cn.edu.ThinkInOO; public class Driver { String DriverName; public void driver(Car c){ } }
以将耦合度降到合适的程度。
所以在Driver类中的driver方法里,我们传入了Car,对于Car如何行使,我们只在Car类中去设置,而和Driver类没有任何关系
package cn.edu.ThinkInOO; public class Driver { String DriverName; public void driver(Car c){ c.go(); } }属性private,读取用get与set是隐藏与封装,
package cn.edu.ThinkInOO; public class Car { private String Type; public String getType() { return Type; } public void setType(String Type) { this.Type = Type; } public void go(Address dest){ System.out.println(Type+"一路加着速,疾驰至"+dest.getAddressName()); } }给Address加了构造方法来传参数:
package cn.edu.ThinkInOO; public class Address { private String addressName; Address(){ } Address(String dest){ this.setAddressName(dest); } public String getAddressName() { return addressName; } public void setAddressName(String addressName) { this.addressName = addressName; } }
package cn.edu.ThinkInOO; public class Driver { private String DriverName; public String getDriverName() { return DriverName; } public void setDriverName(String driverName) { DriverName = driverName; } public void driver(Car c){ c.go(new Address("东北")); } }测试类;
package cn.edu.ThinkInOO; public class Travel { public static void main(String[] args) { Driver d=new Driver(); d.setDriverName("老张"); d.driver(new Car()); } }
package cn.edu.ThinkInOO; public class Driver { private String DriverName; public String getDriverName() { return DriverName; } public void setDriverName(String driverName) { DriverName = driverName; } public void driver(Car c){ c.go(new Address("东北")); } public void driver(Car c,Address dest){ c.go(dest); } }“重载”了driver方法,加了目的地的属性。
package cn.edu.ThinkInOO; public class Vihecle { }我们写一个飞机类继承Vihecle,并把Car也继承Vihecle。
package cn.edu.ThinkInOO; public class Plane extends Vihecle{ private String Type; public String getType() { return Type; } public void setType(String Type) { this.Type = Type; } public void go(Address dest){ System.out.println(planeType+"一路转着螺旋桨,翱翔至"+dest.getAddressName()); } }
package cn.edu.ThinkInOO; public class Car extends Vihecle{ private String Type; public String getType() { return Type; } public void setType(String Type) { this.Type = Type; } public void go(Address dest){ System.out.println(carType+"一路加着速,疾驰至"+dest.getAddressName()); } }
package cn.edu.ThinkInOO; public class Driver { private String DriverName; public String getDriverName() { return DriverName; } public void setDriverName(String driverName) { DriverName = driverName; } public void driver(Vihecle v,Address dest){ } }只需要一个driver方法即可满足所有交通工具。
package cn.edu.ThinkInOO; public abstract class Vihecle { private String Type; public String getType() { return Type; } public void setType(String Type) { this.Type = Type; } public abstract void go(Address dest); }Driver类:
package cn.edu.ThinkInOO; public class Driver { private String DriverName; public String getDriverName() { return DriverName; } public void setDriverName(String driverName) { DriverName = driverName; } public void driver(Vihecle v,Address dest){ System.out.print(DriverName+"驾驶着"); v.go(dest); } }
package cn.edu.ThinkInOO; public class Travel { public static void main(String[] args) { Driver d=new Driver(); d.setDriverName("老张"); Vihecle c=new Car(); c.setType("法拉利"); d.driver(c,new Address("东北")); d.setDriverName("老李"); Vihecle p=new Plane(); p.setType("战斗机"); d.driver(p,new Address("美国")); } }
4.初学者不要考虑太多的原则和条条框框,最重要是动手写
知识点总结于马士兵老师的"设计模式"视频,感谢尚学堂的共享。
转载请注明出处:http://blog.csdn.net/acmman