设计模式基础知识

本文深入探讨设计模式的基础知识,包括设计模式的意义、OOP的七大原则和23种经典设计模式的详细解析。从工厂模式到装饰者模式,再到观察者模式,逐一阐述其应用场景、优缺点及实现机制。同时,介绍了UML类图、类与类之间的关系,以及在实际开发中的应用。通过对设计模式的学习,提升软件设计的灵活性和可维护性。

设计模式基础知识

设计模式(狂胜)
看到第8集

黑马
看到131集

在这里插入图片描述

设计模式简称:GOF23(由4人帮发明)

学习设计模式的意义

在这里插入图片描述

设计模式的基本要数

1.模式名称
2.解决的问题
3解决方案
4.产生的效果

OOP的7大原则

在这里插入图片描述

工厂模式

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

简单工厂模式

在这里插入图片描述

在这里插入图片描述

如果增加一个产品的话,你必须对代码进行修改。不满足开发闭合原则

代码

在这里插入代码片

工厂方法模式

在这里插入图片描述

需要创建多个工厂(每增加一个产品都会新增一个工厂)
好处:不会对原代码进行修改;满足开放闭合原则
缺点:如果新增的产品过多的话,会出现很多的类;代码过度冗余。

在这里插入代码片

抽象工厂模式

创建工厂的工厂

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

这里是引用

在这里插入代码片

建造者模式

在这里插入图片描述

在这里插入图片描述

原型模式

浅克隆
在这里插入图片描述
深克隆
在这里插入图片描述

@Override
	public Object clone() throws  CloneNotSupportedException{
		// 深克隆
		Object obj=super.clone();
		Video_1 v=(Video_1)obj;
		v.createtime=(Date)this.createtime.clone(); // 将属性也进行克隆
		return v;
	}

结构型模式

适配器模式

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

桥接模式

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

代理模式

静态代理

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

动态代理

实现机制:使用反射
角色和静态代理一样
3种实现方式:1.基于接口 (JDK动态代理) 2.基于类 (cglib)、3.javasist(java字节码实现)

关键代码

package com.hjx.Proxy.dynamic;

import com.hjx.Builder.demo2.Product;
import com.hjx.Proxy.demo1.Rent;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//代理类
public class ProxyInvocationHandler implements InvocationHandler {
//	被代理的目标对象
	private Object target;

	public void setTarget(Object target) {
		this.target = target;
	}

	//	生成代理对象
	public Object getProxy(){
		return  Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this );
	}

	// 处理代理实例,并返回结果
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		seeHouse();
		Object result=method.invoke(target,args);
		charge();
		return result;
	}

	public void seeHouse(){
		System.out.println("看房子");
	}
	public void charge(){
		System.out.println("收费");
	}


}

设计模式的分类

在这里插入图片描述

UML

在这里插入图片描述
类图的作用
在这里插入图片描述
类的表示方式
在这里插入图片描述
完整表示的方法
在这里插入图片描述
在这里插入图片描述

类和类之间的关联关系

单向关联
在这里插入图片描述
双向关联
在这里插入图片描述
自关联
在这里插入图片描述

聚合关系和组合关系

聚合关系
在这里插入图片描述
组合关系
在这里插入图片描述

依赖、继承、实现

依赖

在这里插入图片描述

继承

在这里插入图片描述

实现关系

在这里插入图片描述

结构型模式

装饰者模式

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
案例
在这里插入图片描述
装饰者模式的好处

在这里插入图片描述

装饰者模式的使用场景
在这里插入图片描述

外观模式

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

案例
在这里插入图片描述优缺点
在这里插入图片描述
缺点:
不符合开闭原则,如果子系统有修改的话,则必须对统一调度接口进行修改

使用场景
在这里插入图片描述

组合模式

在这里插入图片描述
组合模式的定义
在这里插入图片描述

相关概念

树枝节点:文件夹
叶子节点:文件
容器对象:
叶子对象:

结构

抽象根节点:就是树的根
在这里插入图片描述

案例展示
在这里插入图片描述
类图
在这里插入图片描述

组合模式分类

透明组合模式

在这里插入图片描述

安全组合模式
在这里插入图片描述
在这里插入图片描述

优点

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

享元模式

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

在这里插入图片描述
享元模式的优缺点
在这里插入图片描述

行为型模式

在这里插入图片描述

模板方法模式

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

案例
在这里插入图片描述

优点
在这里插入图片描述
缺点
在这里插入图片描述
适用场景
在这里插入图片描述

策略模式

结构
在这里插入图片描述
案例
在这里插入图片描述
优点

在这里插入图片描述

缺点
在这里插入图片描述
使用场景
在这里插入图片描述

命令模式

在这里插入图片描述

如果按照以前的方法发,不满足类对象的开闭原则(如果厨师被换掉的话,必须对服务员中的所引用的厨师对象进行修改。

定义
在这里插入图片描述

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

在这里插入图片描述
宏命令:批量处理
undo:撤销
redo:恢复

优点
在这里插入图片描述

缺点
在这里插入图片描述
使用场景
在这里插入图片描述

系统可以在不同时间指定不用的请求:例如代码中的的命令执行是根据命令的先后顺序执行的。

责任链模式

在这里插入图片描述

在这里插入图片描述
结构
在这里插入图片描述
案例
在这里插入图片描述

优缺点

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

状态模式

在这里插入图片描述

如果争对电梯的状态设计不采用状态模式,会造成以下问题
在这里插入图片描述

ILift

package com.hjx.state;

/**
 *  电梯接口
 */
public interface ILift {
//	打开
	int OPENING_STATE=1;
//	关闭
	int CLOSE_STATE=2;
//	运行
	int RUNNING_STATE=3;
//	停止
	int STOP_STATE=4;

//	设置电梯状态的功能
	void setState(int state);

//	电梯的功能
	void open();
	void close();
	void run();
	void stop();

}

Lift

package com.hjx.state;

public class Lift implements ILift{
	private int state;
	@Override
	public void setState(int state) {
		this.state=state;
	}

	@Override
	public void open() {
		switch (state){
			case OPENING_STATE:
//				什么事都不做
				 break;
			case CLOSE_STATE:_STATE:
			     System.out.println("电梯打开了");
//			修改状态
			     setState(OPENING_STATE);
				 break;
			case STOP_STATE:_STATE:
			     System.out.println("电梯打开了");
//			修改状态
			     setState(OPENING_STATE);
				 break;
			case RUNNING_STATE:_STATE:
				 break;
		}
	}

	@Override
	public void close() {

	}

	@Override
	public void run() {

	}

	@Override
	public void stop() {

	}
}

Client

package com.hjx.state;

public class Client {
	public static void main(String[] args) {
//		创建电梯对象
		Lift lift=new Lift();
//		设置电梯状态
		lift.setState(ILift.CLOSE_STATE);
//		开门
		lift.open();
	}
}

状态模式定义
在这里插入图片描述
结构
在这里插入图片描述
在这里插入图片描述

优缺点
在这里插入图片描述

观察者模式

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

优缺点

在这里插入图片描述

使用场景
在这里插入图片描述

中介模式

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

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

优缺点

在这里插入图片描述

使用场景
在这里插入图片描述

迭代器模式

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

案例
在这里插入图片描述

优缺点
在这里插入图片描述
使用场景
在这里插入图片描述

访问者模式

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

优缺点
在这里插入图片描述

使用场景
在这里插入图片描述
在这里插入图片描述

备忘录模式

定义
在这里插入图片描述
结构
在这里插入图片描述
在这里插入图片描述
优缺点
在这里插入图片描述
使用场景
在这里插入图片描述

解释器模式

在这里插入图片描述
定义
在这里插入图片描述
抽象语法树
在这里插入图片描述
结构

在这里插入图片描述

案例
在这里插入图片描述

优缺点

在这里插入图片描述
应用场景
在这里插入图片描述

术语讲解

1.聚合

部分与整体的关系,比如汽车与汽车零部件之间的关系。部分可以脱离整体的存在。聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系

2.组合

人与鼻子、耳朵、手之间的关系,即它们是一个整体,不能分离,如果人的生命周期结束了,那么全都结束了
组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值