狂神说Java设计模式

1. 什么是设计模式/h3>

设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案,是一套被反复使用、多数人知晓、及经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保障代码的可靠性,可维护性。

2. 面向对象设计(OOP)七大原则

  • 开闭原则:对扩展开放、对修改关闭
  • 里式替换原则:继承需要修改父类的性质
  • 依赖倒置原则:要面向接口编程、不要面向实现编程
  • 针对接口编程的意思就是说,应当使用Java接口和抽象Java类进行变量的类型声明、参量的类型声明、方法的返回类型声明,以及数据类型的转换等。
  • 不要针对实现编程的意思就是说,不应当使用具体Java类进行变量的类型声明、参量的类型声明、方法的返回类型声明,以及数据类型的转换等。
  • 单一职责原则:控制类的粒度大小,一个类只负责一个职责
  • 接口隔离原则:各个类建立它们需要的专用接口

通俗一点来讲就是接口应该尽量细化,一个接口对应一个功能模块的规范,同时让里面的方法尽可能少,使接口轻便灵活

  • 迪米特原则:一个对象应该对其他对象有最少的了解

通俗一点来讲就是一个类对自己需要耦合或者调用的类知道的最少,你(被耦合或者调用的类)的内部是如何复杂和我没有关系,我就知道你提供的public方法,其他我不关心。

  • 合成复用原则:尽量先使用组合或者聚合等关系来实现,其次才考虑使用继承关系来实现。

3. GoF23(23中设计模式)有哪些/h3>
  • 创建型模式
    1. 单例模式
    2. 工厂模式
    3. 抽象工厂模式
    4. 建造者模式
    5. 原型模式
  • 结构型模式
    1. 适配器模式
    2. 桥接模式
    3. 装饰模式
    4. 组合模式
    5. 外观模式
    6. 享元模式
    7. 代理模式
  • 行为型模式
    1. 模板方法模式
    2. 命令模式
    3. 迭代器模式
    4. 观察者模式
    5. 中介者模式
    6. 备忘录模式
    7. 解释器模式
    8. 状态模式
    9. 策略模式
    10. 职责模式
    11. 访问者模式

4. 创建型–工厂模式

工厂模式:创建者和调用者分离
4.1 简单工厂模式
定义:定义一个生成对象的工厂类,客户端通过工厂类的静态方法来获取对象。

说明:我们定义一个生产汽车的工厂,客户端通过调用工厂类的静态方法并传入所需汽车的名字来获取对象。
缺点:如果我们需要增加其他的车型,那么便需要去工厂类去改变其原则代码,显然这违背了开闭原则 扩展性低。

4.2 工厂方法模式
定义:定义一个生产对象的接口类,由子类实现接口来决定要实例化的类。工厂方法模式将生产的对象推迟到子类去实现。

工厂方法模式与简单工厂模式的比较

  • 简单工厂模式是生产单一的产品
  • 工厂方法模式是声场一个系列的产品族

接口工厂类

抽象建造者类-定义建造者需要做的组件

指挥者-指挥工人生成房子

6.5. 创建型–单例模式

草帽小子–面试常问设计模式——单例模式

7. 结构型–适配器模式

定义:适配器模式是将某一个接口转换成客户端期待的另一个接口,目的是消除由于接口不匹配所造成的的类的不兼容性问题。

主要有三类实现方式:类的适配器模式、对象的适配器模式、接口的适配器模式。

使用方式
客户端期待的接口XXX,定义一个适配器类去实现接口XXX,并在适配器类中可通过继承被适配类或者创建被适配类对象的方式获取目标API方法,然后在适配器类的方法中调用目标函数,而客户端直接调用适配器的方法便可实现转换

AdatperUSB2VGA 首先继承USBImpl获取可连接USB的功能,其次,实现VGA接口,表示该类的类型为VGA。

Projector将USB映射为VGA,只有VGA接口才可以连接上投影仪进行投影

test代码

7.2 对象适配器模式
对象适配器和类适配器使用了不同的方法实现适配,对象适配器使用组合,类适配器使用继承。

举例(将USB接口转为VGA接口),类图如下:

AdapterUSB2VGA实现,不用去实现b()和c()方法。

总结

手机和手机中的软件是什么关系/strong>
手机中的软件从本质上来说并不是一种手机,手机软件运行在手机中,是一种包含与被包含关系,而不是一种父与子或者说一般与特殊的关系,通过继承手机类实现手机软件类的设计是违反一般规律的。

换一种解决思路

抽象:

public abstract class Phone { 	protected Software software; 	public void setSoftware(Software software) {		this.software = software;	} 	public abstract void run(); }public class Oppo extends Phone {	     @Override    public vo

                                                        

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年9月4日
下一篇 2021年9月5日

相关推荐