第三章设计模式

设计模式

设计模式概述:

介绍:

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

作用:

  • 使开发者可以更加简单方便地复用 成功的设计和体系结构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中。
    在这里插入图片描述
静态代理

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

静态代理的操作步骤

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

动态代理

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

动态代理操作步骤

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

设计模式总结

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值