【学习笔记】java模式之基本模式

上课时老师分别讲解了7种基础性的设计模式

  1. 接口
  2. 抽象父类
  3. 私有方法
  4. 存取器方法
  5. 常亮数据管理器
  6. 不变对象
  7. 管程(监视器)

java已经以语言特性的方式内置了对一些基础设计模式的支持,所以,在学习理解这些基本模式过程中,会觉得有着莫名的熟悉
通过系统学习这些基本模式,可以更加清楚了解what、while、when而不再是“兔子就是叫做兔子,哪有为什么”的知其然而不知其所以然。

  • 接口
    通过设计一组提供外部看起来“相同”的服务提供者接口,使得客户对象能够无缝接地使用不同类型的服务提供对象
    接口
    通过接口,可以实现客户对象无缝接的使用不同的服务提供者对象,而不需改变客户类的任何代码。

接口是依赖倒置原则的应用

  • 抽象父类(Abstract Class)
    抽象方法的修饰词必须为public或者protected(因为如果为private则无法被继承实现,但是在实子类中所有抽象方法必须被实现),缺省状态下默认为public。
    抽象类本质上还是一个类,类与类之间的关系是继承。
    当一个类继承于一个抽象类时,必须实现所有的抽象方法,否则该类只能标记为抽象类。
    抽象类的实子类必须实现所有的抽象方法
    这保证了这个类族中具有相同的方法名,这在与接口上有点类似。

抽象父类跟接口使用上会有一种相似的感觉,在写文章时,有同学问我,接口跟抽象到底有什么差别呢?

抽象父类可用于设计一个能够为一组相关类的公共功能提供一致的框架
Java不支持多继承。一个类只能继承自一个父类。因此,继承应该只在绝对必需的时候才使用。
–《Java软件体系结构设计模式标准指南》

开始理解这句时有点困难。
抽象类中不止包含抽象方法,也包含了具体方法,这些具体方法代表着这个类族中不可变的部分,可以说是一种功能规范;而抽象方法则是这个类族中的可变部分,代表着实现类的可能性。
假设有个账单Check模块,其中有很多种账单,A_Check、B_Check、…其中,每个账单都包含着一个相同的打印账单方法,如果用接口的话,则在每个实现类中都需要重复相同的方法,但是通过抽象类的话,则可以通过继承实现,避免了冗余实现。
在抽象类中的不可变部分,在继承实现时应遵循里氏替换原则

里氏替换原则:子类可以扩展父类功能,但是不能改变父类原有的功能,不重写、重载父类原有方法。

  • 私有方法
    只被同类中的其他方法或内部类调用的方法,建议设置为私有方法。

  • 存取器方法
    建议所有实例变量设置为私有并提供存取器方法。

在最开始学习创建类时,总是觉得这样很麻烦而且感觉没多大必要的样子

一般来说,一个对象的不同实例变量的取值,在给定的一个时间点上,构成了对象的状态。

对象的状态可分为公有/私有状态
公有状态:可被不同客户对象存取
私有状态:只在内部使用,不会被其他对象访问到

通过存取器的方式,对客户隐藏了一个属性是直接存取的还是继承得来的细节
通过存取器的方式,如果一个对象的变量的定义发生改变时,如当一个类Student的name由String变为StringBuffer或者其他类型时,直接调用的话,则需要在每处调用处修改,但是用存取器的话,则只需要修改存取器的相关代码即可,这样将大大影响该对象所属应用的可维护性。

客户对象可以使用存取器方法将一个Customer对象从一个状态(原状态)转变到另一个状态(目标状态)。通常,如果该对象无法达到目标状态,它应该通知调用者状态的转变无法完成。这一点可以通过使存取器抛出一个异常来完成。(例如:null赋给基本类型的变量)这点依然无法理解

  • 常量数据管理器
    将常量统一放在一个类中供其他对象访问,为常量数据提供一个易于维护的集中式仓库。

对于常量数据,经常需要反复修改,这样可能导致某些常量散落到各个类处而导致维护起来复杂。

  • 不变对象
    一般来说,一个类具有数据跟行为方法。

数据模型类:仅作为数据的携带者,而不具有任何(出了存取器)具体行为,如数据表类等。
数据模型类的实例称为数据对象

类声明为final,使得类不可被继承;
所有实例变量都必须声明为final(使得变量只能被赋值一次),并在构造方法中设定,并且不提供setter方法;
如果有实例包含直线一个对象的引用,则其对应的getter方法返回的应该是该对象的拷贝而不是对象本身的储存地址。

不变对象模式保证多个客户对象同时访问数据对象不会出现任何问题,还能避免同步带来的性能开销;但是不变对象在设计时应该非常谨慎,因为如果在某一时间发现原本设计为不变对象的数据应该是可变的,则很可能会导致实现改动变得十分麻烦。

  • 管程(Monitor)

竞态条件:通常一个对象在其实现的某个部分可能需要访问某些共享资源以实现设计的某些服务。在多线程环境中,当这样的一个对象被多个线程同时访问时可能会出现不可预料的行为。这种并发访问而导致不正确和不规则行为的情况称为竞态条件

管程通过对资源加锁,保证在任意一个时刻只有一个线程可以访问该对象的任何方法。客户对象无需负责如何保持同步,由服务提供者对象对同步访问负责。(即通过synchronized关键字实现同步)

synchronized关键字能保住在任意时刻只有一个线程被运行访问被添加了关键字的代码片段,但是这种操作的代价是,synchronized的方法的运行速度比不同步的情况下慢了许多倍。

对于同个对象,当一个线程正在执行某个同步方法,其他线程如果要访问该同步方法,将会被阻塞,但是,其他线程依然可以访问该对象的其他非同步方法。

以上即java的7种基础性设计模式的一些简要知识点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值