抽象类和接口是Java里面最为核心的概念,也是所有设计模式的综合体现,包括在日后学习的过程之中也会接触到许多的系统提供的接口和抽象类。接口与抽象类都可以使用的情况下一定要优先使用接口,因为接口可以避免单继承的局限
1 案例分析一(获取信息类)
定义一个ClassName接口,接口中只有一个抽象方法getClassName();设计一个类Company,该类可以实现接口的方法getClassName(),功能是获取该类的类名称;编写应用程序使用Company类。
interface IClassName{
public abstract String getClassName();
}
class Company implements IClassName{
public String getClassName(){
return this.getClass().toString();
}
}
public class JavaDemo{
public static void main(String[] args){
IClassName company = new Company();
System.out.println(company.getClassName());
}
}
2 案例分析二(绘图处理)
考虑一个表示绘图的标准,并且可以根据不同的图形来进行绘制。
interface IGraphical{
public abstract void paint();
}
class Pointer{
private double x;
private double y;
public Pointer(){}
public Pointer(double x, double y){
this.x = x;
this.y = y;
}
public double getX(){
return this.x;
}
public double getY(){
return this.y;
}
}
class Triangle implements IGraphical{
private Pointer nodeA;
private Pointer nodeB;
private Pointer nodeC;
public Triangle(){}
public Triangle(Pointer nodeA, Pointer nodeB, Pointer nodeC){
this.nodeA = nodeA;
this.nodeB = nodeB;
this.nodeC = nodeC;
}
public void paint(){
System.out.println("第一条边:起[" + this.nodeA.getX() + " ," + this.nodeA.getY() + "] 止[" + this.nodeB.getX() + " ," + this.nodeB.getY() + "]" );
System.out.println("第二条边:起[" + this.nodeB.getX() + " ," + this.nodeB.getY() + "] 止[" + this.nodeC.getX() + " ," + this.nodeC.getY() + "]" );
System.out.println("第三条边:起[" + this.nodeC.getX() + " ," + this.nodeC.getY() + "] 止[" + this.nodeA.getX() + " ," + this.nodeA.getY() + "]" );
}
}
class Circle implements IGraphical{
private double radius;
public Circle(){}
public Circle(double radius){
this.radius = radius;
}
public void paint(){
System.out.println("以" + radius + "为半径画圆");
}
}
class Factory{
public static IGraphical getInstance(String className, double ...args){
if("triangle".equalsIgnoreCase(className)){
return new Triangle(new Pointer(args[0], args[1]),new Pointer(args[2], args[3]), new Pointer(args[4], args[5]));
}else if("circle".equalsIgnoreCase(className)){
return new Circle(args[0]);
}else{
return null;
}
}
}
public class JavaDemo{
public static void main(String[] args){
IGraphical igpA = Factory.getInstance("triangle", 1.0, 2.0, 3.0, 4.0, 5.0, 6.0);
igpA.paint();
IGraphical igpB = Factory.getInstance("circle", 1.0);
igpB.paint();
}
}
3 案例分析三(图形)
定义类Shape,用来表示一般二维图形。Shape具有抽象方法area和perimeter,分别用来计算形状的面积和周长,试定义一些二维形状类(如矩形、三角形、圆形、椭圆形等),这些类均为Shape类的子类。
abstract class AbstractShape{
public abstract double area();
public abstract double perimeter();
}
class Ranctangle extends AbstractShape{
private double length;
private double width;
public Ranctangle(){}
public Ranctangle(double length, double width){
this.length = length;
this.width = width;
}
public double area(){
return this.length * this.width;
}
public double perimeter(){
return 2 * (this.length + this.width);
}
}
class Circle extends AbstractShape{
public static final double PI = 3.1415;
private double radius;
public Circle(){}
public Circle(double radius){
this.radius = radius;
}
public double area(){
return PI * this.radius * this.radius;
}
public double perimeter(){
return 2 * PI * this.radius;
}
}
class Factory{
public static AbstractShape getInstance(String className, double ...args){
if("ranctangle".equalsIgnoreCase(className)){
return new Ranctangle(args[0], args[1]);
}else if("circle".equalsIgnoreCase(className)){
return new Circle(args[0]);
}else{
return null;
}
}
}
public class JavaDemo{
public static void main(String[] args){
AbstractShape igpA = Factory.getInstance("circle", 1.0);
AbstractShape igpB = Factory.getInstance("ranctangle", 1.0, 2.0);
System.out.println("【圆】:面积" + igpA.area() + "; 周长" + igpA.perimeter());
System.out.println("【矩形】:面积" + igpB.area() + "; 周长" + igpB.perimeter());
}
}
使用工厂设计模式完全隐藏了实现的子类。