抽象类,接口以及策略模式的总结

  • 抽象类
public abstract class Vehicle{// 类也就变成了抽象类

  public abstract void startup();// 抽象方法没有方法体!子类必须进行重写
  
  public void speedup(){
  };
  
  public void stop(){
  };
  
  public void run(){
  startup();
  speedup();
  stop():
  }
}

1.抽象类中可以没有抽象方法,但包含抽象方法的类必须声明为抽象类;

2.若子类是抽象类,可以不实现父类的抽象方法,否则必须实现父类的抽象方法;

3.抽象类允许有构造方法,可以在子类中调用,但是不能调用它来实例化抽象类;(抽象类是不能实例化成对象的,构造方法是用来给子类创建父类属性的

  • abstract只能用于修饰类和方法,不能和final一起使用

  • 接口

    接口是从多个相似的类中抽象出来的规范,体现了规范和实现分离的设计哲学;

    接口不提供任何实现,它不能包含普通方法,接口内部定义的所有方法都是抽象方法!

    java8对接口进行了改进,允许在接口中定义默认方法和静态方法,这两类方法可以提供方法实现;

    • 定义

      [修饰符] interface 接口名 extends 父接口1,父接口2{}

    • 接口的成员

      接口可以定义成员变量、成员方法(抽象方法、静态方法、默认方法)

      1.接口中所有的成员都是public访问权限,public修饰符可以省略;

      2.接口中的成员变量都是静态常量,而static final修饰符都可以省略

      3.接口中的普通的成员方法都必须是抽象的,abstract修饰符可以省略;

      4.接口中的默认方法必须使用default修饰,静态方法必须使用static修饰,均不能省略。

      • 接口中不能包含构造方法初始化块,只能包含静态常量,默认方法,抽象方法和静态方法
    • 接口的使用

      [修饰符] class 类名 extends 父类 implements 接口1,接口2,…{}

      1.一个类可以实现多个接口,implements;

      2.实现和继承类似,可以获得实现接口里定义的常量、方法;

      3.如果类不是抽象类,那么必须实现接口定义的全部抽象方法;

public interface C extend A,B{
  ~~public static final~~ int SIZE = 10;// 必须初始化,静态常量
  ~~public~~ abstract void sayGoodBye();
  ~~public~~ default int max(int x, int y){}// 属于实例的
  ~~public~~ static int min(int x, int y){} // 属于C接口的
 
}

public class X implements A, B{..}
public class Y implements C{...}

public class InterfaceUse {
    public static void main(String[] args) {
        System.out.println(Interface1.SIZE);
        System.out.println(Interface2.min(1,2));

        A a = new A();
        System.out.println(a.sum(1,2));
        System.out.println(a.max(1,2));
    }
}

class A implements Interface1,Interface2{
    @Override
    public int sum(int x, int y) {
        return x + y;
    }
}

class B implements Interface3{
    @Override
    public int sum(int x, int y) {
        return x + y;
    }

    @Override
    public void sort(int[] array) {
        Arrays.sort(array);
    }
}

public interface Interface1 {

    int SIZE = 10;
    int sum(int x, int y);
}


public interface Interface2 {

    default int max(int x, int y){
        return x > y ? x : y;
    }

    static int min(int x, int y){
        return x > y ? y : x;
    }
}


public interface Interface3 extends Interface1, Interface2{

    void sort(int[] array);
}
- 接口中的**默认方法**可以**重写**,只能通过实现类的**对象**调用;

- 接口中**静态变量**可以通过**实现类**或者**实现类的实例**访问到,而**静态方法**就**不能**通过实现类或者实现类的实例调用;静态方法只能通过**接口.静态方法**调用;
public class InterfaceUse {

  public static void main(String[] args) {

    System.out.println(Interface1.SIZE);
    System.out.println(Interface2.min(1,2));
    System.out.println(Interface1.min(Interface1.SIZE,2));
    // 接口的静态方法只能调用静态成员;

    A a = new A();

    System.out.println(a.sum(1,2));

    System.out.println(a.max(1,2));

  }

}

class A implements Interface1,Interface2{

  @Override

  public int sum(int x, int y) {

    return x + y;

  }

}

class B implements Interface3{

  @Override

  public int sum(int x, int y) {

    return x + y;

  }

  @Override

  public void sort(int[] array) {

    Arrays.sort(array);

  }

}
  • 为什么需要接口?

    • 类可以:1.继承父类;2.实现接口

      继承:单继承子类只能继承一个父类;

      实现:一个类可以实现多个接口;

    • 类+接口实现对一类事物的完全抽象

      • 类相对于对象是抽象的,类的方法是具体的

      • 接口:抽象方法、抽象行为、抽象功能

    • 实例:

// 普通模式
public class Strategy {
    public static void main(String[] args) {
        Door door = new Door();
        door.open();
        door.close();
    }
}

class Door {
    public void open() {
        System.out.println("开门");
    }

    public void close(){
        System.out.println("关门");
    }
}
  • 改进**[策略模式]**
// 1.创建一个接口
public interface Strategy {
   public int doOperation(int num1, int num2);
}

// 2.创建实现接口的实现类
public class OperationAdd implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 + num2;
   }
}

public class OperationSubtract implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 - num2;
   }
}

public class OperationMultiply implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 * num2;
   }
}

// 3.创建Context类
public class Context {
   private Strategy strategy; // 相当于引用接口的类
 
   public Context(Strategy strategy){
      this.strategy = strategy;
   }
 
   public int executeStrategy(int num1, int num2){
      return strategy.doOperation(num1, num2);
   }
}

// 4.使用 Context 来查看当它改变策略 Strategy 时的行为变化
public class StrategyPatternDemo {
   public static void main(String[] args) {
      Context context = new Context(new OperationAdd());    
      System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
 
      context = new Context(new OperationSubtract());      
      System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
 
      context = new Context(new OperationMultiply());    
      System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
   }
}
output:
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
  • 门锁实例
public class StrategyUse {
    public static void main(String[] args) {
        Door door1 =new Door();
        door1.setLock(new FaceLock());
        door1.lockOpen();
        door1.lockClose();

        Door door2 =new Door();
        door2.setLock(new FingerPrintLock());
        door2.lockOpen();
        door2.lockClose();
    }
}

interface Lock{
    void open();
    void close();
}

class FaceLock implements Lock {

    @Override
    public void open() {
        System.out.println("面部解锁开门");
    }

    @Override
    public void close() {
        System.out.println("面部解锁关门");
    }
}

class FingerPrintLock implements Lock {

    @Override
    public void open() {
        System.out.println("指纹解锁开门");
    }

    @Override
    public void close() {
        System.out.println("指纹解锁关门");
    }
}

class Door {
    private Lock lock;

    public void setLock(Lock lock) {
        this.lock =lock;
    }

    public void lockOpen() {
        lock.open();
    }

    public void lockClose() {
        lock.close();
    }
}
  • 登录实例
public class UserLog {
    public static void main(String[] args) {

        LogInScreen logInScreen = new LogInScreen(new AcountLogIn());
        logInScreen.LogIn();
        logInScreen = new LogInScreen(new ScanLogIn());
        logInScreen.LogIn();
        logInScreen = new LogInScreen(new MobileLogIn());
        logInScreen.LogIn();
    }
}

interface LogInMethod{
    void logIn();
}

class AcountLogIn implements LogInMethod{

    @Override
    public void logIn() {
        System.out.println("输入账号密码登录!");
    }
}

class MobileLogIn implements LogInMethod {

    @Override
    public void logIn() {
        System.out.println("输入手机号验证码登录");
    }
}

class ScanLogIn implements LogInMethod {

    @Override
    public void logIn() {
        System.out.println("请扫码登录");
    }
}

class LogInScreen {
    private LogInMethod logInMethod;

    public LogInScreen(LogInMethod logInMethod) {
        this.logInMethod = logInMethod;
    }

    public void LogIn() {
        logInMethod.logIn();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值