JavaSE自学笔记013_Real(抽象类、接口、两种设计模式)

JavaSE自学笔记013_Real(抽象类、接口)

一、基本概述

(一)抽象类(关键字:abstract)


//抽象方法
public abstract class Animal{
    abstract void eat();
}
abstract void eat(); 去掉方法体,加一个abstract关键字就是一个抽象类,如果一个类具有抽象方法,则再类的申明上必须要加abstract关键字,变成一个抽象类,我们要注意的时,抽象方法没有方法体(也就是没有大括号),所以不能直接调用,也正是因为抽象方法没有方法体,所以不能直接构造抽象类。
但是子类可以继承抽象类,并且重写抽象类,处分子类也是抽象类,这样就会对所有子类有了共同约束,同时父类已经实现的方法也能被所有的子类所复用。
//Dog类
public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("Dog is eating!");
    }
}

/*
由抽象方法的类必须要申明为抽象类
 */

//Animal类
public abstract class Animal {
    public abstract void eat();

    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.eat();
    }
}

输出结果:
Dog is eating!

(二)接口(关键字:interface implement)

接口只有方法的定义,不能有方法的实现
接口与接口之间用继承连接关键字extends
接口域普通类之间连接用关键字implement
//Pet接口的实现
public interface Pet {
    //跑的方法
    void run();
    //吃的方法
    void eat();
}

//Cat类的实现
public class Cat implements Pet{
    public void run(){
        System.out.println("Cat is running!");
    }

    public void eat(){
        System.out.println("Cat is eating!");
    }
}
接口种定义抽象方法,不能有实例字段,不能有方法实现(静态的可以),Java8以后再接口中可以定义默认的方法,编写接口的目的在于对类的某些能力进行约束或规范,接口不能实例化,没有构造器。
接口种的方法默认是public的,推荐使用默认的

接口是多实现的,一个类可以实现多个接口,但是只能继承一个类,接口之间也可以相互继承。

二、深入理解

1、
继承是is-a的关系,dao is an animal cat is a pet
实现是can-do的关系,实现更体现出一个类的能力,通过实现多个接口是可以聚合多个能力的。

抽象类是模板式的设计,而接口类式契约式的设计。
抽象类设计时往往就是将相同实现方法抽象在父类,由子类独立实现哪些名字相同,但各自不同的方法。

三、设计模式

设计模式是人们为软件开发种相同表征的我呢提,抽象出来的可重复利用的解决方案,在某种程度上,设计模式已经代表了一些特定的情况和最佳的时间,同时也起到了软件工程师之间沟通的行话的作用。

(一)面向对象设计原则

1、开闭原则(Open Close Principle)
开闭原则就是说对拓展开放,对修改关闭
可以通过抽象约束,封装变化来实现开闭原则,即通过接口或者抽象类为软件实体定义一个相对稳定的抽象层,而将相同的可变因素封装在形同的具体实现类中,而软件中易变的细节可以从抽象派生来的实现类进行拓展,当软件需要发生变化时,只需要根据需求重新派生一个实现类来拓展就可以了。

2、里氏代换原则(Liskov Substitution Principle)
继承必须确保超类所拥有的性质在子类中仍然成立,也就是说,子类继承父类的时候,除了添加新的方法完成新增功能外,尽量不要重写父类的方法。

3、依赖倒转原则(Dependence Inversion Principle) (低耦合,高内聚)
要面向接口编程,不要面向实现编程
1、每个类尽量提供接口或者抽象类,或者两者都具备。
2、变量的声明类型尽量使接口或者抽象类
3、任何类都不应该从具体类派生。
4、使用继承的时候尽量遵循里氏代换原则。

4、接口隔离原则(Interface Segregation Principle)
要求程序员尽量将臃肿庞大的接口拆分成更具体地接口,让接口中只含有客户感兴趣地方法。
这个原则地意思:使用多个隔离地接口,比使用单一地接口要好,还是一个降低类之间耦合度的意思,其实设计模式就是一个软件的设计思想,从大型软件框架出发,为了升级和维护方便,所以上文多次出现:降低依赖,降低耦合。

5、迪米特法则(最少知道原则)(Demeter Principle)
只与你直接朋友交谈,不跟陌生人说话,含义是:如果两个软件实体无需直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用,其目的使降低类之间的耦合度,提高模块的相对独立性。

6、合成复用原则(Composite Reuse Principle)
原则是尽量使用合成/聚合的方式,而不是使用继承,如果使用继承关系,则必须严格遵守里氏代换原则,合成复用原则同里氏代换原则相辅相成,两者都是开闭原则 的具体实现规范。

7、单一规则
一个类只做一件事情。

(二)模板方法设计模式

模板方法(Template Method)模式的定义:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种【行为型模式】
优缺点:
1、优点:
	(1)它封装了不变的部分,拓展可变部分,它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
	(2)它在父类中提取了公共的部分代码,便于代码复用。
	(3)部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。
2、缺点:
	(1)对于每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统会更加庞大,设计更加抽象,间接地增加了系统实现的复杂度。
	(2)父类中的抽象方法由于子类实现,子类执行的结果会影响父类的结果,这导致一种方向的控制结构,他提高了代码阅读的难度。
	(3)由于继承关系自身的缺点,如果父类添加新的抽象方法,则所有子类都要更改一遍。

代码范例实现:

//动物抽象类
public abstract class Animal {

    //吃
    public abstract void eat();

    //睡
    public abstract void sleep();

    //嬉戏
    public abstract void play();

    //动物一天的生活
    public void life(){
        sleep();
        eat();
        play();
        eat();
        sleep();
        play();
        eat();
        sleep();
    }
}

//狮子类
public class Lion extends Animal{

    public String Name;

    //构造器
    public Lion(String name) {
        this.Name = name;
    }

    @Override
    public void eat() {
        System.out.println(this.Name + "在吃东西");
    }

    @Override
    public void sleep() {
        System.out.println(this.Name + "在睡觉");
    }

    @Override
    public void play() {
        System.out.println(this.Name + "在嬉戏打闹");
    }

}

//参观者类
public class Vistor {
    public void vist(Animal animal){
        System.out.println("我来参观动物园,看动物生活的一天");
        animal.life();
        System.out.println("参观结束了!");
    }

    public static void main(String[] args) {
        Vistor vistor = new Vistor();
        Animal lion = new Lion("lion");
        vistor.vist(lion);

    }
}

输出结果:
我来参观动物园,看动物生活的一天
lion在睡觉
lion在吃东西
lion在嬉戏打闹
lion在吃东西
lion在睡觉
lion在嬉戏打闹
lion在吃东西
lion在睡觉
参观结束了!

(三)策略设计模式

策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

策略模式的主要优点如下。
1、多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句,如 if…else 语句、switch…case 语句。
2、策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。
3、策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。
4、策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。
5、策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。

其主要缺点如下。
1、客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类。
2、策略模式造成很多的策略类,增加维护难度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仲子_real

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值