其他分享
首页 > 其他分享> > TIJ-4Edition-接口

TIJ-4Edition-接口

作者:互联网

1、抽象类和抽象方法

  包含抽象方法的类叫做抽象类。只要类中包含抽象方法,就要声名为抽象类。

  导出类会继承基类的所有方法,因此如果没有覆写(实现)基类中的所有抽象方法,

  就必须声名为抽象类。

2、接口

  interface声名一个接口,接口是比抽象类更加抽象的存在。

  除了默认方法和静态方法,接口中的其他方法都没有提供实现。

  接口中的方法默认是public的。实现接口方法时,必须将其声名为public的。

  接口可以包含域,但是这些域隐式地是public、static 和 final的。

  一个类只能继承一个基类,但是能实现多个接口。extends在前,implement在后。

  接口允许多重继承。

  接口可以嵌套,但是由于接口中元素必须是public的,因此嵌套接口自动(只能)是public的。

  实现接口时,不需要实现它内部嵌套的接口。

3、接口与工厂

  更准确地说,这是工厂方法的实现。

  在工厂方法设计模式中,每一个类都有自己的工厂。

  而不是简单工厂一样,一个工厂就实现了所有类的对象创建。

//: interfaces/Factories.java
import static net.mindview.util.Print.*;

interface Service {
  void method1();
  void method2();
}

interface ServiceFactory {
  Service getService();
}

class Implementation1 implements Service {
  Implementation1() {} // Package access
  public void method1() {print("Implementation1 method1");}
  public void method2() {print("Implementation1 method2");}
}    

class Implementation1Factory implements ServiceFactory {
  public Service getService() {
    return new Implementation1();
  }
}

class Implementation2 implements Service {
  Implementation2() {} // Package access
  public void method1() {print("Implementation2 method1");}
  public void method2() {print("Implementation2 method2");}
}

class Implementation2Factory implements ServiceFactory {
  public Service getService() {
    return new Implementation2();
  }
}    

public class Factories {
  public static void serviceConsumer(ServiceFactory fact) {
    Service s = fact.getService();
    s.method1();
    s.method2();
  }
  public static void main(String[] args) {
    serviceConsumer(new Implementation1Factory());
    // Implementations are completely interchangeable:
    serviceConsumer(new Implementation2Factory());
  }
}
/* Output: Implementation1 method1 Implementation1 method2 Implementation2 method1 Implementation2 method2 *///:~

 

4、接口之间的转换——适配器模式

  接口使得设计更加的灵活,但是也有一个限制,接口只能接受该接口类型的参数。

  怎么把没有实现该接口的类用于接受该接口的方法呢?

  这就需要适配器模式来实现了。

  设目标接口为A,要转换的类为B;

  那么,可以创建一个类C,

  C实现了A接口,而继承了B类(也可以使用代理)。

  在C中,A接口的方法委托给B类中的方法来完成。 

  这样,C既是A类型的,又是B类型的,同时还实现了B方法向A方法的转换。

import java.nio.*;
import java.util.*;

public class RandomDoubles {
  private static Random rand = new Random(47);
  public double next() { return rand.nextDouble(); }
  public static void main(String[] args) {
    RandomDoubles rd = new RandomDoubles();
    for(int i = 0; i < 7; i ++)
      System.out.print(rd.next() + " ");
  }
}

public class AdaptedRandomDoubles extends RandomDoubles
implements Readable {
  private int count;
  public AdaptedRandomDoubles(int count) {
    this.count = count;
  }
  public int read(CharBuffer cb) {
    if(count-- == 0)
      return -1;
    String result = Double.toString(next()) + " ";
    cb.append(result);
    return result.length();
  }    
  public static void main(String[] args) {
    Scanner s = new Scanner(new AdaptedRandomDoubles(7)); //Scanner构造器接收一个Readable接口对象,Readable接口只要求实现一个read方法
    while(s.hasNextDouble())
      System.out.print(s.nextDouble() + " ");
  }
} 
/* Output: 0.7271157860730044 0.5309454508634242 0.16020656493302599 0.18847866977771732 0.5166020801268457 0.2678662084200585 0.2613610344283964 *///:~

 

5、接口与策略设计模式

  策略设计模式属于行为型模式。

  在策略模式中,一个类的行为或其算法可以在运行时更改。(根据代理对象或参数的改变)

  

/**
 * 策略接口
 */
interface Processor {
    String name();
    Object process(Object input);
}

/**
 * 使用策略的类
 */
class Apply {
    public static void process(Processor p, Object s) {
        System.out.println("Using Processor " + p.name());
        System.out.println(p.process(s));
    }

    public static void main(String[] args) {
        String s="adaf adfds sdf sdfd sfs s q";
        Apply.process(new Upcase(), s);
        Apply.process(new Downcase(), s);
        Apply.process(new Splitter(), s);
    }
}

/**
 * 策略抽象类
 */
abstract class StringProcessor implements Processor{
    public String name() {
        return getClass().getSimpleName();
    }
    public abstract String process(Object input);
}

/**
 * 策略1
 * 将字符串转换为大写
 */
class Upcase extends StringProcessor {
    public String process(Object input) { // Covariant return
        return ((String)input).toUpperCase();
    }
}

/**
 * 策略2
 * 将字符串转化为小写
 */
class Downcase extends StringProcessor {
    public String process(Object input) {
        return ((String)input).toLowerCase();
    }
}

/**
 * 策略3
 * 将字符串分割为数组
 */
class Splitter extends StringProcessor {
    public String process(Object input) {
        return Arrays.toString(((String)input).split(" "));
    }
}

 

  

  

  

 

标签:4Edition,String,void,接口,class,TIJ,new,public
来源: https://www.cnblogs.com/lqblala/p/15170923.html