本文面向应付软件工程考试,真的想学东西,可以不用看了
面向对象设计原则以及在项目中的应用
迪米特法则
- 一个实体应当尽可能少的和其他实体发生相互作用,使得系统相对独立
- 核心观点,解耦合,弱耦合,类的耦合弱复用性才可能提高。
项目中的实例:
在项目中JAVA程序中,我要实现在一个页面中展示多条信息。需要用adaptor 调用 presenter类的方法。简单的方法是,从acvtivity中将presenter传入adapter中,以供adapter调用他的方法。 但这样是强耦合的。为了解耦,使用activity为adapter定义一个接口,adapter中通过调用接口来调用activity,在activity中再去调用presenter,这样,adapter可以与presenter交互的同时,两者也是尽可能少的知道对方。
里氏代换原则
- 使用基类的地方,必须透明的使用其子类
项目中的实例:
在Android端需要实现对视频的解码过程,并且针对不同编码格式的视频,需要不同类型的解码器。
针对h264编码的视频,我定义了一个decoderH264类,由于后期功能扩充,系统又要支持h265视频的解析。因此我是用decoderH265类继承decoderH264类,并且保证方法的签名相同,这样可以将h264的解码器都透明的替换成h265解码器,以支持h265视频解码。
开闭原则
- 对修改关闭,对拓展开放
项目实例:由于再实现解析视频时,采用两种模式,一种是从文件中读入视频数据,一种是通过socket传入视频数据。
利用类的多态这个特性,不修改使用方的代码。我简历个一个AbstractReader 抽象类 ,并泛化其两个子类 FileReader 和 SocketReader。这样就可以任意修改代码,而不会影响调用方的代码
单一职责原则
后端springboot中分 DAO Entity Service Controller层,每层的任务明确,职责单一
- DAO 持久层,与数据库交互
- Entity 实体层,是数据库在项目中的类
- Service 业务层,调用dao层,接收dao层的返回数据,完成基本功能
- controller 控制层 负责接收前后端交互,接收前端请求,调用service层
依赖倒转原则
项目实例:由于再实现解析视频时,采用两种模式,一种是从文件中读入视频数据,一种是通过socket传入视频数据。
利用类的多态这个特性,不修改使用方的代码。我简历个一个AbstractReader 抽象类 。
在AbstractReader中定义功能所需的各种接口,调用方针对接口去编程,比如 reader.read()。 而不是针对具体的类编程
并泛化其两个子类 FileReader 和 SocketReader。这样就可以任意修改代码,而不会影响调用方的代码
合成服用原则
- 尽量使用组合聚合
- 使用合成复用原则,关联已有类。定义一个解析器对象,从而进行关联,而不是继承一个解析器类进行操作。
public H264TcpReceiver(Context context, SurfaceView sfw, final String IP) {
mThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
//
…………
//构造解析器
DecodeTcp decoder = new DecodeTcp(mContext,mSurfaceView,in);
decoder.start();
//
…………………
} catch (IOException e) {
e.printStackTrace();
}
}
});
面向对象的设计原则
项目中的观察者模式
项目中需要实现使用列表动态展示当前就局域网内设备的功能。
为了展示各个设备,需要将device 类加入到 deviceList中,我们需要调用adaptor,notifychange() 函数,来通知作为观察者的CyclerView ,deviceList已经发生了变化,然后CyclerView才会更新前端UI将新加入的设备展现出来。
项目中开发时选用的过程模型
- 在我们的项目中选择增量模型,先开发主要功能或用户最需要的功能,随着事件推进,不断加入新的辅助功能或次要功能。