第三章设计模式

设计模式

设计模式概述:

介绍:

**设计模式是人们在长期的软件开发中的经验总结,是对某些特定问题的经过实践检验的特定解决方法,是软件设计中的“三十六计”.**

作用:

  • 使开发者可以更加简单方便地复用 成功的设计和体系结构List item
  • 帮助开发者做出有利于系统复用的选择,避免损害系统复用性的设计
  • 使其他开发者更加容易理解其设计思路,便于团队交流

设计模式的分类

目前所说的设计模式通常指GOF(Gang of Four 四人组)
包含23种设计模式

设计模式有两种分类方式。

(一)根据目的划分
 1.创建型模式
 用于描述如何创建对象其主要的特点是将对象的创建与使用分离。
 2.结构型模型
 用于描述如何将类或对象按某种布局组成更大的结构
 3.行为型模式
 用于描述了或对象之间如何相互协作,共同完成单个对象无法独立完成的任务以及如何分配职责。
(二)根据作用范围划分 :
即根据设计模式主要作用于类上还是主要作用于对象上来划分,这种可分为类模式和对象模式两种。

1.类模式:用于处理类于子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了
2.对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时是可以变化的,更具动态性。
GOF设计模式的分类设计模式之间的关系

面对对象设计原则

设计原则有七种分别是

1.单一职责原则:

单一职责原则规定一个类应该有且仅有一个引起他变化的原因,简单来说,一个类应该只负责一个职责,否则类应该被拆分。

如果一个类承担太多职责 会出现一下两个缺点:
第一: 一个职责的变化可能影响这个类实现其他职责的能力,或者引发其他职责故障。
第二:当客户需要该类的某一个职责时,不得不将其他不需要的职责全部都包含进来,从而造成亢余或风险。

2.开闭原则

开闭原则是面向对象设计中最基础的设计原则,开闭原则规定一个实体软件,如类,模块核函数,应该对扩展开放,对修改关闭,其意思是,在程序需要进行扩展的时候,不能通过修改已有的代码实现变化,而应该通过扩展软件实体的方式实现,如根据需要重新哦爱生一个实现类。想要达到这样的效果,这就需要使用接口,面向接口编程。

3.里式替换原则

里式替换原则是面对对象设计的基本原则之一,是继承复用的基石。该原则规定所有引用基类的地方必须透明的使用其子类的对象。这个原则可以判断继承关系是否合理。

4.依赖倒置原则

依赖导致原则的核心思想是:依赖于约定而不依赖于具体实现,即面向接口编程,对象的依赖关系有三种传递方法

(1)通过构造方法传递依赖对象,即构造方法的参数是需要依赖的接口类型。
(2)通过setter方法传递依赖对象,即setter方法的参数是需要依赖的接口类型。
(3)接口声明依赖,及接口的参数是需要依赖的接口类型。

作用:能够降低客户于实现模块之间的耦合,

5.接口隔离原则

要求尽量将庞大的接口拆分成更小,更具体的接口。让接口中只包含客户感兴趣的方法。一个类对另一个类的依赖应该建立在最小的接口上。要为各个类建立他们需要的专用接口,而不要试图去建立一个庞大的接口供所有依赖他的类去调用,否则很多实现类要被迫的去实现他们不要的方法。

接口的隔离原则和单一原则都是为了提高类的内聚性,降低它们之间的耦合度,但两者是不同的。

  • 单一职责原则注重的是职责,而接口隔离原则注重的是对接口的依赖的隔离。
    单一职责原则主要约束类,他针对的是程序中的实现和细节;而接口隔离原则主要约束接口,主要针对抽象和程序整体框架的创建。

6.迪米特法则

迪米特法则又称最少知道原则,是直接一个软件实体应当尽可能的少的与其他实体发生相互作用。
####7.合成复用原则
尽量使用组合聚合的方式,而不是继承关系达到软件复用的目的。

继承复用是类型的复用:必须具备is-a关系才可通过继承方式进行复用,且从基类继承而来的实现是静态的,不可能在运行期间发生变化,因此没有足够的灵活性。
而合成复用是has-a关系,将已有对象纳入到新对象中使之成为新对象的一部分,因此新对象可以调用已有对象的功能,使用合成复用方式,新对象可以自运行期间动态的引用与成分对象类型相同的实现。

设计模式应用

简单工厂模式

简单工厂模式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

简单工厂模式包含
1。工厂:简单模式的核心,负责实现创建所有实例的逻辑,工厂提供静态方法,根据传入的参数创建所需的产品实例。
2.抽象产品:工厂创建的所有实例的父类类型,是负责描述所有产品的公共接口。可以是接口或抽象类。
.3.具体产品:抽象产品的实现类,是工厂的创建目标,工厂创建的实例就是某个具体产品类的实例。

简单工厂模式操作

简单工厂操作步骤

// 创建工厂
public class JDBCFactory {
	public static JDBC newInstance() {
		return new MySQLJDBC();
	}
	public static JDBC newInstance(String type) {
		if ("mysql".equals(type)) {
			return new MySQLJDBC();
		}else if("oracle".equals(type)) {
			return new OracleJDBC();
		}return null;}}

//通过类图创建工厂对象 重写工厂中的方法
public class UserService {
//添加,修改,删除..
//private JDBC jdbc=new OracleJDBC();//耦合度高
private JDBC jdbc=JDBCFactory.newInstance("oracle");

//添加
public void addUser() {
	jdbc.Connection();
	System.out.println("添加用户成功!");
}} 

工厂方法模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

工厂方法模式操作

在这里插入图片描述
在这里插入图片描述

//1.创建工厂接口
public interface JDBCFactory {
public JDBC newInstance();}
//工厂实现类实现工厂接口
public class MySQLJDBCFactory implements JDBCFactory{
public JDBC newInstance() {
	return new MySQLJDBC();
}}
//在用户类中创建所需的工厂对象
public class UserService {
//添加,修改,删除..
private JDBC jdbc;
public void setJdbc(JDBC jdbc) {
	this.jdbc = jdbc;
}
//添加
public void addUser() {
	jdbc.Connection();
	System.out.println("添加用户成功!");
}}
//测试类
public class TestJDBC {
public static void main(String[] args) {
	//确定数据库类型
	JDBCFactory factory=new MySQLJDBCFactory();//创建工厂对象
	JDBC jdbc=factory.newInstance();//使用工厂对象,创建JDBC对象
	UserService service=new UserService();
	service.setJdbc(jdbc);//设置业务类中使用的JDBC对象
	service.addUser();
}}

代理模式

代理模式包含
1.抽象主题:通过接口或抽象类声明业务方法。
2.真是主题:实现了抽象主题中的具体业务,是实施代理的目标对象,及代理对象所代表的真是对象,是最终要引用的对象,
3.代理:提供了与真实主题相同的接口,其内部含有对真实主题的引用,可以访问,控制或拓展真实主题的功能。

实现代理的方式有很多种,总体上分为静态代理或动态代理两种。

  • 静态代理有开发者针对抽象主题编写相关的代理类实现,编译之后生成代理类的class文件。静态代理在编译时已经实现,代理关系在编译期就已经绑定,编译完成后代理类是一个实际的class文件。
  • 动态代理是在运行时动态生成的,即编译完成后没有实际的代理类class文件,而是在运行动态生成代理类字节码,并加载到JVM中。
    在这里插入图片描述
静态代理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

静态代理的操作步骤

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

动态代理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

动态代理操作步骤

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

设计模式总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值