• 自学java 第九章接口


    今天学习了接口。

    首先和接口相似的是抽象类。只要含有抽象方法就必须定义为抽象类,但抽象类中不一定必须有抽象方法。

    若继承一个抽象类,则导出类必须实现该抽象类的全部抽象方法,否则导出类也必须定义为抽象类。

    接口可以说是一个完全抽象的类,它内部定义的方法都是抽象方法。

    interface关键字前可以加public关键字(但仅限于该接口在与其同名的文件夹中被定义),否则就是有包访问权限。由于接口中的方法都是隐式的public型的(即不能用private 或protected,否则编译报错),因此实现接口时,在接口中定义的方法在实现该接口的类中必须把它们显示定义为public,否则访问权限降低,编译会报错。

    接口中可以包含域,它们隐式地是static和final的。

    一个接口可以继承多个接口;一个类可以同时继承另一个类和多个接口。

    使用接口的核心原因:

    1.能够向上转型为多个基类型(提高灵活性);

    2.确保只是创建一个接口,防止客户端程序员创建它的对象。

    接口可以进行嵌套,即可以在一个类中定义接口,或在一个接口中再定义接口。这些内部的接口可是public或protected或private的。

    接口中学到的设计模式:

    策略设计模式,能够根据所传递参数对象的不同而具有不同行为的方法

    下面是一个简单的策略模式例子:


    public class Strategy { //一个简单的策略模式
    private static String s="This Is A Strategy Class";
    public static void main(String[] args){
    Processor[] p={
    new Upcase(),
    new Downcase()
    };
    for(Processor x:p)
    Apply.process(x, s);
    }

    }

    class Processor{
    public String name(){
    return getClass().getSimpleName();
    }
    Object process(Object input){
    return input;
    }
    }

    class Upcase extends Processor{
    String process(Object input){
    return ((String)input).toUpperCase();
    }
    }

    class Downcase extends Processor{
    String process(Object input){
    return ((String)input).toLowerCase();
    }
    }

    class Apply{
    public static void process(Processor p,Object s){
    System.out.println("Using Processor"+p.name());
    System.out.println(p.process(s));
    }
    }

    适配器模式,http://www.cnblogs.com/java-my-life/archive/2012/04/13/2442795.html

    自己写的一个例子:

    public class Adapter { //适配器策略,简单例子
    public static void main(String[] args){
    Waveform w=new Waveform();
    Apply1.process(new FilterAdapter(new Lowpass()), w);
    Apply1.process(new FilterAdapter(new Highpass()), w);
    Apply1.process(new FilterAdapter(new Lowpass()), w);
    }

    }

    class Waveform{
    private static long count;
    private final long id=count++;
    public String toString(){
    return "waveform"+id;
    }
    }


    class Apply1{
    public static void process(Processor1 p,Object s){
    System.out.println("Using Processor1"+p.name());
    System.out.println(p.process(s));
    }
    }

    interface Processor1{
    String name();
    Object process(Object input);
    }

    class Filter{

    public String name(){
    return getClass().getSimpleName();
    }
    public Waveform process(Object input){
    return (Waveform)input;
    }

    }

    class Lowpass extends Filter{
    public Waveform process(Waveform w){
    return w;
    }
    }

    class Highpass extends Filter{
    public Waveform process(Waveform w){
    return w;
    }
    }

    class FilterAdapter implements Processor1{
    private Filter filter;
    FilterAdapter(Filter f){
    filter=f;
    }
    @Override
    public String name() {
    return filter.name();
    }

    @Override
    public Object process(Object input) {
    return filter.process((Waveform)input);
    }

    }

    工厂方法模式,http://www.cnblogs.com/forlina/archive/2011/06/21/2086114.html

    这里有我自己写的一个简单的例子:

    import java.util.Random;
    import java.util.Scanner;

    public class Demo_ninteen {
    public static void playGame(GameFactory f){
    Game g=f.getGame();
    g.play();
    }
    public static void main(String[] args) {
    System.out.println("请选择游戏,抛硬币选1,掷骰子选2:");
    Scanner scan=new Scanner(System.in);
    if(scan.nextInt()==1)
    playGame(new ThrowCoinFactory());
    else
    playGame(new ThrowDiceFactory());
    }

    }

    interface Game{  //抽象游戏产品
    void play();
    }

    interface GameFactory{  //抽象工厂
    Game getGame();
    }

    class ThrowCoin implements Game{ //抛硬币
    private Random rand=new Random();
    public void play() {
    if(rand.nextInt(2)==1)
    System.out.println("您此次抛的是正面");
    else
    System.out.println("您此次抛的是反面");
    }
    }

    class ThrowCoinFactory implements GameFactory{  //实际工厂
    public Game getGame(){
    return new ThrowCoin();
    }
    }

    class ThrowDice implements Game{ //掷骰子
    private Random rand=new Random();
    public void play(){
    switch(rand.nextInt(6)+1){
    case 1:
    System.out.println("您掷的是1");
    break;
    case 2:
    System.out.println("您掷的是2");
    break;
    case 3:
    System.out.println("您掷的是3");
    break;
    case 4:
    System.out.println("您掷的是4");
    break;
    case 5:
    System.out.println("您掷的是5");
    break;
    case 6:
    System.out.println("您掷的是6");
    break;
    }
    }
    }

    class ThrowDiceFactory implements GameFactory{  //实际工厂
    public Game getGame(){
    return new ThrowDice();
    }
    }

  • 相关阅读:
    Sql Server中的游标最好只用于有主键或唯一键的表
    SQLServer中DataLength()和Len()两内置函数的区别(转载)
    Sql server bulk insert
    ASP.NET CORE中使用Cookie身份认证
    用.net中的SqlBulkCopy类批量复制数据 (转载)
    使用C#的AssemblyResolve事件和TypeResolve事件动态解析加载失败的程序集
    Entity framework 中Where、First、Count等查询函数使用时要注意
    注意SSIS中的DT_NUMERIC类型转换为字符类型(比如DT_WSTR)时,会截断小数点前的0
    记一次完整的android源码截屏事件的捕获<标记砖>
    ffmpeg添加水印的方法举例 (砖)
  • 原文地址:https://www.cnblogs.com/grj0011/p/4841570.html
Copyright © 2020-2023  润新知