目录
工厂模式
23种设计模式
简单工厂模式
1️⃣ 抽象产品:Config
2️⃣ 具体产品:IPhone
3️⃣ 具体产品:XiaoMi
4️⃣ 工厂类:ConcreteProduct
工厂方法模式
1️⃣ 工厂接口:IFactory
2️⃣ 具象工厂:IPhoneFactory
3️⃣ 具象工厂:XiaoMiFactory
迭代器模式
1️⃣ 基础类1:Iterator
2️⃣ 基础类2:IEnumerable
3️⃣ 迭代器示例:Group
4️⃣ 使用示例:Test
命令模式
1️⃣ 效果演示
1️⃣ 基础接口:command
2️⃣ 盒子执行的命令:BoxCommand
3️⃣ 要控制撤销重做的物体:BoxEntity
4️⃣ BoxTest
人生不如意十之八九,这个面试啊,免不了会遇到些坎坷,比如说面试官问:
除了这些,还有吗?
那上节我们说了单例模式、观察者模式、代理模式
所以今天呢,橙哥再来和大家好好说道说道:工厂方法、迭代器模式、命令模式 。
最后的命令模式,特别适合做回放,回放有Gif演示。
工厂模式
定义: 工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定实例化哪一个类,而不必实现知道要实例化的是哪一个类。
工厂模式是一个设计模式吗?
不是的,工厂模式分为三种,23种设计模式中,工厂模式就占了两种 ↓
在这个工厂模式家族中有3种形态:
简单工厂模式,这是他的中文名,英文名叫做Simple Factory。(它不属于23种设计方式之一)
工厂方法模式,这是他的中文名,英文名叫做Factory Method。
抽象工厂模式,这是他的中文名,英文名叫做Abstract Factory。
23种设计模式
设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式 结构型模式,共七种:适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
简单工厂模式
注意了啊,该模式不属于23种设计模式之一,面试时就不用说了,
但可以在Unity中使用。
简单工厂模式组成:
1)工厂类:工厂类在客户端的直接控制下(Create方法)创建产品对象。 2)抽象产品:是具体产品们的父类,或者是它们共同都继承的接口。抽象产品可以是一个普通类、抽象类(传送门:Abstract)或接口。 3)具体产品:实现抽象产品,定义工厂具体加工出的对象。
接口和抽象类的区别:
一个类可以继承很多个接口,但只能继承一个抽象类
由小老弟就问了,简单工厂模式怎样使用呢?
即先写抽象产品 ,把产品共同的内容写在一个脚本上
再写具体产品 ,继承抽象产品 ,接着写其它代码。因为继承了抽象产品 ,这样能少些很多代码。
最后写工厂类,供程序调用。输入不同的条件,工厂去调用不同的具体产品 ,得到不同的产品。
示例:
1️⃣ 抽象产品:Config
public interface Config
{
///
/// 芯片
///
void Chip();
}
2️⃣ 具体产品:IPhone
using UnityEngine;
//苹果手机
public class IPhone : Config
{
public void Chip()
{
Debug.Log("使用A14芯片");
}
}
3️⃣ 具体产品:XiaoMi
using UnityEngine;
//小米手机
public class XiaoMi : Config
{
public virtual void Chip()
{
Debug.Log("使用高通芯片");
}
}
4️⃣ 工厂类:ConcreteProduct
public class ConcreteProduct
{
//生产工厂,供外部调用
public static Config Create(int id)
{
switch (id)
{
case 1:
return new XiaoMi();
case 2:
return new IPhone();
}
return null;
}
}
工厂方法模式
工厂方法与简单工厂的区别在于:
工厂方法将工厂类进行了抽象,将实现逻辑延迟到工厂的子类。
不同的产品对应单独的工厂。
下图左图为简单工厂,右图为工厂方法:
书写方法:
先写抽象产品 ,把产品共同的内容写在一个脚本上
再写具体产品 ,继承抽象产品 ,接着写其它代码。因为继承了抽象产品 ,这样能少些很多代码。
最后写工厂类。与简单工厂模式不同的是,现在工厂类分成了 “抽象工厂脚本”、“具象工厂脚本”。
那现在该怎样使用呢?
现在我们使用该工厂模式的方法是,是直接调用需要的 “具象工厂” 方法,
而不是像简单工厂模式一样,输入条件,得到想要的内容。
下方展示工厂脚本改变的内容,其他脚本跟简单工厂模式相同。
1️⃣ 工厂接口:IFactory
public interface IFactory
{
///
/// 得到芯片
///
IConfig Create();
}
2️⃣ 具象工厂:IPhoneFactory
using UnityEngine;
public class IPhoneFactory : IFactory
{
public IConfig Create()
{
Debug.Log("这个工厂生产了 IPhoneAllConfig 配置的苹果手机");
return new IPhoneAllConfig();
}
}
3️⃣ 具象工厂:XiaoMiFactory
using UnityEngine;
public class XiaoMiFactory : IFactory
{
public IConfig Create()
{
Debug.Log("这个工厂生产了 XiaoMiAllConfig 配置的小米手机");
return new XiaoMiAllConfig();
}
}
迭代器模式
迭代器模式 : 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
Unity中实现迭代器模式的API是 foreach。
但是,foreach可能不包含我们想要的功能,
下面,我们就来自己实现一个通用的迭代器。
使用方法是:
1、首先自己的迭代器继承基础脚本的类:IEnumerable,可覆写里面的方法。
2、接着就可以使用啦!
1️⃣ 基础类1:Iterator
using System.Collections.Generic;
public class Iterator : IteratorBase
{
private IList items;
public int Count => items.Count;
public Iterator(IList tempItems)
{
items = tempItems;
}
private int index = -1;
public object Current => items[index];
public bool MoveNext()
{
return items.Count > ++index;
}
public void Reset()
{
index = -1;
}
}
2️⃣ 基础类2:IEnumerable
using System.Collections.Generic;
public interface IteratorBase
{
object Current { get; }
int Count { get; }
bool MoveNext();
///
/// 将当前指针移动到第一位
///
void Reset();
}
public class IEnumerable
{
private IList items = new List();
public virtual int Count => items.Count;
public virtual object this[int index]
{
get { return items[index]; }
set { items.Insert(index, value); }
}
public virtual IteratorBase GetIterator()
{
return new Iterator(items);
}
}
3️⃣ 迭代器示例:Group
继承IEnumerable就好,Group便已实现了迭代器模式
你可以重写、拓展你的迭代器,实现想要的功能
using UnityEngine;
public class Group : IEnumerable
{
public override IteratorBase GetIterator()
{
Debug.Log("你可以重写你的迭代器");
return base.GetIterator();
}
}
下面是最后一步,有的同学别睡觉,敲黑板
4️⃣ 使用示例:Test
using UnityEngine;
public class Test : MonoBehaviour
{
private void Start()
{
Group myGroup = new Group();
myGroup[0] = "s";
myGroup[0] = "k";
myGroup[0] = "o";
myGroup[0] = "d";
myGroup[0] = "e";
print(myGroup.Count);
IteratorBase iterator = myGroup.GetIterator();
print(iterator.Count);
while (iterator.MoveNext())
{
print("当前元素是:" + iterator.Current);
}
}
}
命令模式
命令模式是游戏中很有用的设计模式,书中有一句话是这样说的:
Encapsulate a request as an object, thereby letting users parameterize clients with different requests, queue or log requests, and support undoable operations. —《Design Patterns: Elements of Reusable Object-Oriented Software》
意思是:命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象,同时支持可撤消的操作。
适用于:
Unity画画游戏的撤销、重做
小时候推箱子游戏的撤销操作、
五子棋的悔棋操作...
这个模式的特点是:
提供撤销操作(或者还有重做)
将输入命令封装成对象(方法):即从Update里面检测,拿到了一个方法里面,在Update里调用。
1️⃣ 效果演示
点击录制后,我用的WASD操作cube移动
点击回放后,cube自动运动,演示回放。
下面我们来看一下示例脚本有哪些:
1️⃣ 基础接口:command
///
/// 供其他物体继承,实现不同功能的执行、撤销、重做功能
///
public class command
{
protected float _time;
///
/// 录制用到了时间。
/// 那些PS的撤销操作、推箱子的撤销操作等,就不需要时间了
///
public float time => _time;
public virtual void Execute(BoxEntity avator)
{
}
public virtual void Undo(BoxEntity avator)
{
}
public virtual void Redo(BoxEntity avator)
{
}
}
2️⃣ 盒子执行的命令:BoxCommand
继承了command,并进行了重写。
在后续工程中,我们可能不仅盒子的录制要用命令模式,同一个工程还有画画模块,那画画模块也继承command
这样我们就可以通过统一的接口command,去调用任意实现了command的盒子录制、画画撤销了
using UnityEngine;
public class BoxCommand : command
{
Vector3 _trans;
public BoxCommand(Vector3 m, float t)
{
_trans = m;
_time = t;
}
public override void Execute(BoxEntity avator)
{
avator.move(_trans);
}
public override void Undo(BoxEntity avator)
{
avator.move(-_trans);
}
}
3️⃣ 要控制撤销重做的物体:BoxEntity
我们有了命令,也要有命令要控制的对象。
现在就把BoxEntity挂载到要控制的对象身上,并且根据需要,该脚本中有移动、或者隐藏显示、颜色变化等等的实际状态命令。
这些命令供BoxCommand去调用。
using UnityEngine;
///
/// 挂载到实体身上,控制实体的运动
///
public class BoxEntity : MonoBehaviour
{
Transform _transform;
void Start()
{
_transform = transform;
}
public void move(Vector3 T)
{
_transform.Translate(T);
}
}
4️⃣ BoxTest
该脚本封装了输入命令,并在Update实时检测;
有栈函数,执行了操作后就存上;
有开始记录、开始演示回放的方法,供程序调用。
using System;
using UnityEngine;
using System.Collections.Generic;
public class BoxTest : MonoBehaviour
{
//待操作对象
public BoxEntity boxEntity;
//保存的操作序列
//这儿如果增为两个栈:撤销栈与重做栈,那么便可在撤销时入重做栈,重做时入撤销栈。完成类似PS的操作。
Stack commandStack = new Stack ();
//当前记录的时间节点
float recordTime;
//当前操作模式:无操作、录制、回放
private RecoderState recoderState = RecoderState.None;
void Update()
{
switch (recoderState)
{
case RecoderState.None:
break;
case RecoderState.Record:
Record();
break;
case RecoderState.PlayBack:
PlayBack();
break;
}
}
private enum RecoderState
{
None,
Record,
PlayBack
}
///
/// 切换到回放模式,挂载到Button上
///
public void callBack()
{
recoderState = RecoderState.PlayBack;
}
///
/// 切换到记录模式,挂载到Button上
///
public void run()
{
recoderState = RecoderState.Record;
}
///
/// 控制对象运行,记录命令
///
void Record()
{
recordTime += Time.deltaTime;
//得到当前帧是否操作了命令
command cmd = InputHandler();
if (cmd != null)
{
//记录当前执行的命令
commandStack.Push(cmd);
//去执行
cmd.Execute(boxEntity);
}
}
///
/// 回放操作
///
void PlayBack()
{
recordTime -= Time.deltaTime;
//返回在堆栈顶部的物体。(不移除)
if (commandStack.Count > 0 && recordTime < commandStack.Peek().time)
{
commandStack.Pop().Undo(boxEntity);
}
}
///
/// 根据输入获取操作命令
///
command InputHandler()
{
if (Input.GetKey(KeyCode.W))
return new BoxCommand(new Vector3(0, 0.1f, 0), recordTime);
if (Input.GetKey(KeyCode.S))
return new BoxCommand(new Vector3(0, -0.1f, 0), recordTime);
if (Input.GetKey(KeyCode.A))
return new BoxCommand(new Vector3(-0.1f, 0, 0), recordTime);
if (Input.GetKey(KeyCode.D))
return new BoxCommand(new Vector3(0.1f, 0, 0), recordTime);
return null;
}
}
甭管你现在有没有跳槽升职的想法,赶紧先备着,
面试前天背一背,对吧?
你可能感兴趣的:(unity,设计模式,游戏引擎)
Java设计模式--工厂方法模式
yaCoding
Java设计模式 java 工厂方法模式 开发语言
工厂方法模式1.工厂方法模式的概述1.1工厂模式是简单工厂模式的延伸,符合开闭原则的基础上,还可以在增加新的具体产品对象时不需要对已有系统做任何修改。1.2工厂方法模式:定义一个用于创建对象的接口,但是让子类决定将哪个类实例化,工厂方法模式让一个类的实例化延伸到其子类。(也就是说在工厂方法模式中,不再提供一个统一的工厂类来创建所有的产品对象,而是对于不同的产品提供不同的工厂。例如:宝马工厂生产宝马
设计模式教程:解释器模式(Interpreter Pattern)
扣丁梦想家
设计模式教程 设计模式 解释器模式
1.什么是解释器模式?解释器模式(InterpreterPattern)是一种行为型设计模式,通常用于处理语言(例如数学表达式、SQL查询等)中的语法和解释。该模式定义了一个文法,并通过解释器类来解释文法中的表达式。通过将语言的语法规则表示为类,能够轻松地解释和执行表达式。解释器模式将每种语法规则表示为一个类,并提供一个解释方法,该方法根据语法规则对输入进行解析。通常,这种模式用于编写编程语言解析
Mac Unity编辑器中Process调用Python脚本。
ShawnWeasley
python java linux 人工智能 unity
这玩意是真的难,环境:macOS10.15.4Unity2019.4Python3.8首先我们要知道一个API:System.Diagnostics.Process可以打开其他程序。我期望能在Unity中直接调用一个写好的python脚本。需求很简单,却足足研究了三四个小时。一开始的思路是,用Unity打开终端,再自动输入一条命令比如python3.8xxx就可以了。用百度,发现win上的问题好像
【Unity粒子特效分享-卡通漫画-烟花特效】
井队Tell
# 粒子特效篇 unity 游戏引擎
卡通漫画-烟花特效前言回顾效果图前言回顾可以点击传送门预览。传送门:【Unity粒子特效分享-宇宙星系】.传送门:【Unity粒子特效分享-魔法粒子特效超炫大招】.传送门:【Unity粒子特效分享-刀光特效】.传送门:【Unity粒子特效分享-技能特效】.传送门:【Unity粒子特效分享-科幻魔法光圈脉冲特效】.传送门:【Unity粒子特效分享-血迹飞溅特效】.传送门:【Unity粒子特效分享-高
23种设计模式 - 工厂方法模式
強云
软件架构 设计模式 工厂方法模式
模式定义工厂方法模式(FactoryMethodPattern)是一种创建型设计模式,定义用于创建对象的接口,让子类决定实例化哪个类,从而将对象创建过程延迟到子类。其核心目的是解耦对象的创建与使用,增强系统的扩展性,符合开闭原则。模式结构抽象产品(Product):定义对象的接口(如数控系统中的运动控制器)。具体产品(ConcreteProduct):实现抽象产品的具体类(如直线运动、圆弧运动控制
Unity3D 实用技巧 - 理解骨骼动画原理 & 在Unity3D中使用
Unity官方开发者社区
其实我们在游戏中,会常会应用到动画。所以今天小编与大家一起来深入了解“动画”,其实动画主要分为关节动画、骨骼动画、单一网格模型动画(关键帧动画)。1)关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画;2)骨骼动画:广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运
ABAP面向对象之工厂模式(Factory Pattern)
南南阿爸
ABAP设计模式 hibernate 开发语言 工厂方法模式
概述工厂模式(FactoryPattern)是Java中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。介绍定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。解决的问题主要解决接口选择的问题。何时使用:我们明确
设计模式--类图、实例代码
HarryTusta
java 设计模式
前言本文是参照尚硅谷、黑马程序员以及cyc2018记录的个人学习笔记,仅供记录,不确保严谨性,部分实例代码是根据自己的理解抽象了代码,若不理解,更多具象实例可以参考其他网上实例资料,欢迎讨论学习。设计模式在软件工程中,设计模式是对软件设计中普遍存在(反复出现)的各种问题所提出的解决方案。设计模式的目的设计模式是为了让程序具有更好的代码重用性:即相同功能的代码不用多次编写可读性:即变成规范性,便于其
事件朔源模式——云计算架构常用设计模式
life风起云涌
设计模式
背景在分布式系统当中,处理数据的主要方法是保存数据当前的状态。例如,传统的CRUD模式种,从存储器读取数据,进行修改,并更新数据库种当前的数据状态,而此过程的实现,通常需要锁定数据的事务来进行实现。因此,这个过程主要存在着一些局限性:CRUD系统的更新操作直接针对数据存储可能会限制性能、响应能力和拓展性,因为其必须处理锁定数据的开销;高并发情况下,可能会发生更新数据冲突;除非有额外的审计机制,否则
mysql8.4+mysql router读写分离
Alex_z0897
mysql 数据库
以下为容器环境内搭建准备工作:拉取镜像:镜像版本mysql8.4container-registry.oracle.com/mysql/community-router8.4下载mysql_shellmysql-shell-9.0.1-linux-glibc2.17-x86-64bit.tar.gz下载地址:https://downloads.mysql.com/archives/shell/参考
C#中的设计模式:构建更加优雅的代码
Envyᥫᩣᩚ
c# 开发语言
C#在面向对象编程(OOP)方面的强大支持,我们可以探讨“C#中的设计模式”。这不仅有助于理解如何更好地组织代码,还能提高代码的可维护性和可扩展性。引言设计模式是软件工程中经过实践验证的解决方案模板,它们提供了一种标准化的方法来解决常见的开发问题。对于使用C#进行开发的程序员来说,理解和应用这些模式可以帮助创建结构良好、易于维护和扩展的应用程序。本文将介绍几种常用的设计模式,并展示如何用C#实现它
【Java】代理模式
非 白
代理模式 java 开发语言
代理模式代理模式是指给某一个对象提供一个代理,并由代理对象来控制对真实对象的访问代理模式是一种结构型设计模式背景如果不采用代理,对一个类的多个方法进行监控时,重复的代码总是重复出现,不但破坏了原方法,如果要实现多个监控,将会对代码造成大量冗余。同时,还导致业务代码,与非业务的监控代码掺杂在一起,不利于扩展和维护。代理类在无限制膨胀,就需要无限的修改业务代码。而采用代理后,原方法不需要做任何改动,操
Unity3D使用鼠标旋转缩放平移视角
肚皮朝上的刺猬
unity3D Unity3D视角变换实现
Unity使用鼠标旋转缩放平移视角用代码在Game界面完美实现Scene界面的操作方法。使用方法:把脚本挂在相机上,把跟踪的target拖到脚本上。视角跟踪的是一个空物体,当然如果你是做RPG游戏需要跟踪某一角色的视角,那就不需要中键平移功能,把空物体换成角色就行。代码主要是分三部分功能进行实现。右键拖动控制视角的旋转;滚轮旋转控制视角的缩放;中键拖动控制视角的平移。右键拖动控制旋转主要是用Get
游戏引擎学习第112天
虾球xz
游戏引擎 学习 java
黑板:优化今天的内容是关于优化的,主要讨论了如何在开发中提高代码的效率,尤其是当游戏的帧率出现问题时。优化并不总是要将代码做到最快,而是要确保代码足够高效,以避免性能问题。优化的过程是一个反复迭代的过程,目标是找到一个“足够好”的解决方案,而不是追求极致优化。优化的第一步并不是直接优化代码,而是要进行测量和分析。这一步很重要,因为只有了解代码的表现和瓶颈,才能有效地进行优化。测量代码的性能,确定哪
设计模式---命令模式
菜鸟起航ing
Java设计模式 设计模式 命令模式 java
1.简介命令模式(CommandPattern)是一种行为设计模式,它将一个请求封装为一个对象,从而让你可以使用不同的请求把客户端参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式通常用于以下几种情况:解耦调用操作的客户与执行操作的类:通过命令模式,可以使得调用操作的客户不需要知道是谁将会执行这个操作,以及如何执行。需要对操作进行记录、排队或日志记录:命令模式允许系统将请求记录到日
Java 与设计模式(15):模板方法模式
暗星涌动
设计模式 java 设计模式 模板方法模式 spring boot
一、定义模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架(也就是大致的步骤和流程),而将一些具体步骤的实现延迟到子类中。这样,子类可以不改变算法的结构即可重新定义算法的某些特定步骤。二、Java示例举个简单的例子:假设我们要泡一杯茶和一杯咖啡,这两者的制作过程有一些共同的步骤,比如烧水、倒水、搅拌等,但也有不同的地方,比如茶需要放茶叶,而咖啡需要放咖啡粉。泡茶的过程:烧水、放茶叶、倒
【Unity 监狱内部环境资产包】Jails Interior 提供了完整的监狱内部结构,包括牢房、走廊、审讯室、看守室等,并配备了大量高质量的家具、铁栏、门窗和其他装饰,快速搭建沉浸式的监狱场景
Unity游戏资源学习屋
Unity插件
JailsInterior是一款专为Unity设计的监狱内部环境资产包,适用于犯罪题材、恐怖游戏、警察模拟、逃脱解谜等类型的游戏。该插件提供了完整的监狱内部结构,包括牢房、走廊、审讯室、看守室等,并配备了大量高质量的家具、铁栏、门窗和其他装饰,帮助开发者快速搭建沉浸式的监狱场景。详细介绍1.逼真的监狱内部环境提供完整的监狱场景,包括牢房、走廊、审讯室、警卫室等,能够用于各类犯罪、逃脱、警察题材的游
市面上采用多进程架构的游戏或游戏引擎的案例深入分析
你一身傲骨怎能输
软件架构设计 架构 游戏 游戏引擎
《绝地求生》(PUBG)《绝地求生》(PUBG)是一款采用多进程架构的游戏,这种设计帮助它在处理复杂的游戏逻辑和网络通信时提高了性能和稳定性。以下是一些关于《绝地求生》如何利用多进程架构的具体细节:多进程架构的优势性能优化:多进程架构允许游戏将不同的任务分配到多个处理器核心上运行,这样可以充分利用现代多核CPU的计算能力。例如,游戏的物理计算、AI逻辑、渲染和网络通信可以在不同的进程中并行处理,从
23种设计模式-享元(Flyweight)设计模式
萨达大
软考中级-软件设计师 设计模式 享元模式 软考 软件设计师 C++ 行为型设计模式 JAVA
文章目录一.什么是享元设计模式?二.享元模式的特点三.享元模式的结构四.享元模式的优缺点五.享元模式的C++实现六.享元模式的JAVA实现七.代码解析八.总结类图:享元设计模式类图一.什么是享元设计模式? 享元(Flyweight)设计模式是一种结构型设计模式,通过共享对象来减少内存占用和对象创建开销。它通过将对象的可共享部分与不可共享部分分离,减少重复对象的数量,从而节省内存。 享元模式的核心思
设计模式 - 单例模式
one客
设计模式 设计模式 单例模式 c++
设计模式-单列模式单例模式(SingletonPattern)定义:单例模式(SingletonPattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。该模式通过控制实例的创建过程来避免多次创建同一个对象。单例模式的关键点:只有一个实例:确保某个类在整个系统中只有一个实例。全局访问点:提供一个静态方法来访问该实例,确保全局可以访问到这个唯一实例。单例模式的
C++ 设计模式-外观模式
ox0080
# 北漂+滴滴出行 C++设计模式 VIP 激励 c++ 外观模式 开发语言
外观模式的定义外观模式是一种结构型设计模式,它通过提供一个简化的接口来隐藏系统的复杂性。外观模式的核心思想是:封装复杂子系统:将多个复杂的子系统或组件封装在一个统一的接口后面。提供简单接口:为客户端提供一个更简单、更易用的接口,而不需要客户端直接与复杂的子系统交互。外观模式就像一个“前台接待员”,客户端只需要与这个接待员打交道,而不需要了解后台复杂的运作机制。外观模式的核心思想简化接口外观模式通过
【设计模式精讲】结构型模式之装饰器模式
道友老李
设计模式精讲 设计模式 装饰器模式
文章目录第五章结构型模式5.3装饰器模式5.3.1装饰器模式介绍5.3.2装饰器模式原理5.3.3装饰器模式应用实例5.3.4装饰器模式总结个人主页:道友老李欢迎加入社区:道友老李的学习社区第五章结构型模式5.3装饰器模式5.3.1装饰器模式介绍装饰模式(decoratorpattern)的原始定义是:动态的给一个对象添加一些额外的职责.就扩展功能而言,装饰器模式提供了一种比使用子类更加灵活的替代
设计模式-模板方法实现
阿绵
设计模式 java 开发语言
文章目录模式结构模式特点示例代码输出结果关键点解析模式的优缺点使用场景总结模板方法模式(TemplateMethodPattern)是一种行为型设计模式,它定义了一个操作中的算法骨架,而将某些步骤的实现延迟到子类中。通过这种方式,模板方法模式可以让子类在不改变算法结构的情况下,重新定义算法中的某些步骤模式结构模板方法模式的结构包括以下几个关键部分:抽象类(AbstractClass):定义算法的骨
Python性能优化:懒加载与其他高级技巧
车载testing
pytest数据驱动框架开发 python python 数据库 开发语言
Python性能优化:懒加载与其他高级技巧在软件开发中,我们经常会遇到一些需要大量资源或时间来初始化的对象。如果这些对象在程序的整个生命周期中只被使用一次或很少使用,那么在程序启动时就立即初始化它们将是一种资源浪费。什么是懒加载?懒加载是一种设计模式,它推迟了对象的初始化直到其被实际需要的时候。这种方式可以提高程序的启动速度,减少内存消耗,并在某些情况下提高性能。实现懒加载的步骤定义类和属性:首先
Day48(补)【AI思考】-设计模式三大类型统一区分与记忆指南
一个一定要撑住的学习者
# AI深度思考学习方法 设计模式
文章目录设计模式三大类型统一区分与记忆指南**一、创建型模式(对象如何生?)****二、结构型模式(对象如何组?)****三、行为型模式(对象如何动?)****1.行为型类模式(靠继承)****2.行为型对象模式(靠组合)****四、统一对比表****五、终极记忆技巧**设计模式三大类型统一区分与记忆指南让思想碎片重焕生机的灵魂:行为模式分三类,每一类又有好多不同的模式,特别是行为式模式,还要区分
大厂面试真题-说说DDD中的防腐层以及它和四层架构的关系
鱼跃鹰飞
大厂真题 DDD 架构设计 1024程序员节 职场和发展 开发语言 面试
DDD(领域驱动设计)中的防腐层(Anti-CorruptionLayer,ACL)是一种设计模式,旨在解决不同子系统或限界上下文间由于领域模型或接口不兼容而带来的集成问题。以下是对DDD防腐层的详细介绍,以及它与四层架构的关系:一、DDD防腐层定义:防腐层是一种在不同应用间转换的机制,通过引入一层适配层来隔离和转换不同系统间的交互。作用:隔离领域模型:保护自身领域模型免受其他领域模型代码的侵害。
Oculus SDK:Oculus集成Unity开发环境_2024-07-26_05-43-25.Tex
chenjj4003
游戏开发 unity 游戏引擎 microsoft mr ui c# python
OculusSDK:Oculus集成Unity开发环境OculusSDK:Oculus集成Unity开发环境环境准备Unity版本选择在开始集成OculusSDK到Unity开发环境之前,选择正确的Unity版本至关重要。OculusSDK支持特定版本的Unity,因此确保你的Unity版本与OculusSDK兼容是必要的。截至撰写本教程时,Oculus建议使用Unity2020.3.14f1或更
同步&异步日志系统-设计模式
2401_82609762
设计模式
六大原则单⼀职责原则(SingleResponsibilityPrinciple)类的职责应该单⼀,⼀个⽅法只做⼀件事。职责划分清晰了,每次改动到最⼩单位的⽅法或类。使⽤建议:两个完全不⼀样的功能不应该放⼀个类中,⼀个类中应该是⼀组相关性很⾼的函数、数据的封装⽤例:⽹络聊天:⽹络通信&聊天,应该分割成为⽹络通信类&聊天类开闭原则(OpenClosedPrinciple)对扩展开放,对修改封闭使⽤建
Java 设计模式之解释器模式
xiangxiongfly915
# Java 设计模式 java 设计模式 解释器模式
文章目录Java设计模式之解释器模式概述UML代码实现Java设计模式之解释器模式概述解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。UMLAbstr
Java 设计模式之桥接模式
xiangxiongfly915
# Java 设计模式 java 设计模式 桥接模式
文章目录Java设计模式之桥接模式概述UML代码实现Java设计模式之桥接模式概述桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。通过桥接模式,可以避免类爆炸问题,并提高系统的可扩展性。UML核心思想:抽象部分:定义高层的控制逻辑。实现部分:定义底层的具体实现。桥接:通过组合的方式连接抽象部分和实现部分。角色:Implementor:实现部分的接口,定义行为。Con
二分查找排序算法
周凡杨
java 二分查找 排序 算法 折半
一:概念 二分查找又称
折半查找(
折半搜索/
二分搜索),优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而 查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表 分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步
java中的BigDecimal
bijian1013
java BigDecimal
在项目开发过程中出现精度丢失问题,查资料用BigDecimal解决,并发现如下这篇BigDecimal的解决问题的思路和方法很值得学习,特转载。
原文地址:http://blog.csdn.net/ugg/article/de
Shell echo命令详解
daizj
echo shell
Shell echo命令
Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式:
echo string
您可以使用echo实现更复杂的输出格式控制。 1.显示普通字符串:
echo "It is a test"
这里的双引号完全可以省略,以下命令与上面实例效果一致:
echo Itis a test 2.显示转义
Oracle DBA 简单操作
周凡杨
oracle dba sql
--执行次数多的SQL
select sql_text,executions from (
select sql_text,executions from v$sqlarea order by executions desc
) where rownum<81;
&nb
画图重绘
朱辉辉33
游戏
我第一次接触重绘是编写五子棋小游戏的时候,因为游戏里的棋盘是用线绘制的,而这些东西并不在系统自带的重绘里,所以在移动窗体时,棋盘并不会重绘出来。所以我们要重写系统的重绘方法。
在重写系统重绘方法时,我们要注意一定要调用父类的重绘方法,即加上super.paint(g),因为如果不调用父类的重绘方式,重写后会把父类的重绘覆盖掉,而父类的重绘方法是绘制画布,这样就导致我们
线程之初体验
西蜀石兰
线程
一直觉得多线程是学Java的一个分水岭,懂多线程才算入门。
之前看《编程思想》的多线程章节,看的云里雾里,知道线程类有哪几个方法,却依旧不知道线程到底是什么?书上都写线程是进程的模块,共享线程的资源,可是这跟多线程编程有毛线的关系,呜呜。。。
线程其实也是用户自定义的任务,不要过多的强调线程的属性,而忽略了线程最基本的属性。
你可以在线程类的run()方法中定义自己的任务,就跟正常的Ja
linux集群互相免登陆配置
林鹤霄
linux
配置ssh免登陆
1、生成秘钥和公钥 ssh-keygen -t rsa
2、提示让你输入,什么都不输,三次回车之后会在~下面的.ssh文件夹中多出两个文件id_rsa 和 id_rsa.pub
其中id_rsa为秘钥,id_rsa.pub为公钥,使用公钥加密的数据只有私钥才能对这些数据解密 c
mysql : Lock wait timeout exceeded; try restarting transaction
aigo
mysql
原文:http://www.cnblogs.com/freeliver54/archive/2010/09/30/1839042.html
原因是你使用的InnoDB 表类型的时候,
默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,
因为有的锁等待超过了这个时间,所以抱错.
你可以把这个时间加长,或者优化存储
Socket编程 基本的聊天实现。
alleni123
socket
public class Server
{
//用来存储所有连接上来的客户
private List<ServerThread> clients;
public static void main(String[] args)
{
Server s = new Server();
s.startServer(9988);
}
publi
多线程监听器事件模式(一个简单的例子)
百合不是茶
线程 监听模式
多线程的事件监听器模式
监听器时间模式经常与多线程使用,在多线程中如何知道我的线程正在执行那什么内容,可以通过时间监听器模式得到
创建多线程的事件监听器模式 思路:
1, 创建线程并启动,在创建线程的位置设置一个标记
2,创建队
spring InitializingBean接口
bijian1013
java spring
spring的事务的TransactionTemplate,其源码如下:
public class TransactionTemplate extends DefaultTransactionDefinition implements TransactionOperations, InitializingBean{
...
}
TransactionTemplate继承了DefaultT
Oracle中询表的权限被授予给了哪些用户
bijian1013
oracle 数据库 权限
Oracle查询表将权限赋给了哪些用户的SQL,以备查用。
select t.table_name as "表名",
t.grantee as "被授权的属组",
t.owner as "对象所在的属组"
【Struts2五】Struts2 参数传值
bit1129
struts2
Struts2中参数传值的3种情况
1.请求参数绑定到Action的实例字段上
2.Action将值传递到转发的视图上
3.Action将值传递到重定向的视图上
一、请求参数绑定到Action的实例字段上以及Action将值传递到转发的视图上
Struts可以自动将请求URL中的请求参数或者表单提交的参数绑定到Action定义的实例字段上,绑定的规则使用ognl表达式语言
【Kafka十四】关于auto.offset.reset[Q/A]
bit1129
kafka
I got serveral questions about auto.offset.reset. This configuration parameter governs how consumer read the message from Kafka when there is no initial offset in ZooKeeper or
nginx gzip压缩配置
ronin47
nginx gzip 压缩范例
nginx gzip压缩配置 更多
0
nginx
gzip
配置
随着nginx的发展,越来越多的网站使用nginx,因此nginx的优化变得越来越重要,今天我们来看看nginx的gzip压缩到底是怎么压缩的呢?
gzip(GNU-ZIP)是一种压缩技术。经过gzip压缩后页面大小可以变为原来的30%甚至更小,这样,用
java-13.输入一个单向链表,输出该链表中倒数第 k 个节点
bylijinnan
java
two cursors.
Make the first cursor go K steps first.
/*
* 第 13 题:题目:输入一个单向链表,输出该链表中倒数第 k 个节点
*/
public void displayKthItemsBackWard(ListNode head,int k){
ListNode p1=head,p2=head;
Spring源码学习-JdbcTemplate queryForObject
bylijinnan
java spring
JdbcTemplate中有两个可能会混淆的queryForObject方法:
1.
Object queryForObject(String sql, Object[] args, Class requiredType)
2.
Object queryForObject(String sql, Object[] args, RowMapper rowMapper)
第1个方法是只查
[冰川时代]在冰川时代,我们需要什么样的技术?
comsci
技术
看美国那边的气候情况....我有个感觉...是不是要进入小冰期了?
那么在小冰期里面...我们的户外活动肯定会出现很多问题...在室内呆着的情况会非常多...怎么在室内呆着而不发闷...怎么用最低的电力保证室内的温度.....这都需要技术手段...
&nb
js 获取浏览器型号
cuityang
js 浏览器
根据浏览器获取iphone和apk的下载地址
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" content="text/html"/>
<meta name=
C# socks5详解 转
dalan_123
socket C#
http://www.cnblogs.com/zhujiechang/archive/2008/10/21/1316308.html 这里主要讲的是用.NET实现基于Socket5下面的代理协议进行客户端的通讯,Socket4的实现是类似的,注意的事,这里不是讲用C#实现一个代理服务器,因为实现一个代理服务器需要实现很多协议,头大,而且现在市面上有很多现成的代理服务器用,性能又好,
运维 Centos问题汇总
dcj3sjt126com
云主机
一、sh 脚本不执行的原因
sh脚本不执行的原因 只有2个
1.权限不够
2.sh脚本里路径没写完整。
二、解决You have new mail in /var/spool/mail/root
修改/usr/share/logwatch/default.conf/logwatch.conf配置文件
MailTo =
MailFrom
三、查询连接数
Yii防注入攻击笔记
dcj3sjt126com
sql WEB安全 yii
网站表单有注入漏洞须对所有用户输入的内容进行个过滤和检查,可以使用正则表达式或者直接输入字符判断,大部分是只允许输入字母和数字的,其它字符度不允许;对于内容复杂表单的内容,应该对html和script的符号进行转义替换:尤其是<,>,',"",&这几个符号 这里有个转义对照表:
http://blog.csdn.net/xinzhu1990/articl
MongoDB简介[一]
eksliang
mongodb MongoDB简介
MongoDB简介
转载请出自出处:http://eksliang.iteye.com/blog/2173288 1.1易于使用
MongoDB是一个面向文档的数据库,而不是关系型数据库。与关系型数据库相比,面向文档的数据库不再有行的概念,取而代之的是更为灵活的“文档”模型。
另外,不
zookeeper windows 入门安装和测试
greemranqq
zookeeper 安装 分布式
一、序言
以下是我对zookeeper 的一些理解: zookeeper 作为一个服务注册信息存储的管理工具,好吧,这样说得很抽象,我们举个“栗子”。
栗子1号:
假设我是一家KTV的老板,我同时拥有5家KTV,我肯定得时刻监视
Spring之使用事务缘由(2-注解实现)
ihuning
spring
Spring事务注解实现
1. 依赖包:
1.1 spring包:
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.
iOS App Launch Option
啸笑天
option
iOS 程序启动时总会调用application:didFinishLaunchingWithOptions:,其中第二个参数launchOptions为NSDictionary类型的对象,里面存储有此程序启动的原因。
launchOptions中的可能键值见UIApplication Class Reference的Launch Options Keys节 。
1、若用户直接
jdk与jre的区别(_)
macroli
java jvm jdk
简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。
JDK就是Java Development Kit JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者,而不是开发者。 如果安装了JDK,会发同你
Updates were rejected because the tip of your current branch is behind
qiaolevip
学习永无止境 每天进步一点点 众观千象 git
$ git push joe prod-2295-1
To git@git.dianrong.com:joe.le/dr-frontend.git
! [rejected] prod-2295-1 -> prod-2295-1 (non-fast-forward)
error: failed to push some refs to 'git@git.dianron
[一起学Hive]之十四-Hive的元数据表结构详解
superlxw1234
hive hive元数据结构
关键字:Hive元数据、Hive元数据表结构
之前在 “[一起学Hive]之一–Hive概述,Hive是什么”中介绍过,Hive自己维护了一套元数据,用户通过HQL查询时候,Hive首先需要结合元数据,将HQL翻译成MapReduce去执行。
本文介绍一下Hive元数据中重要的一些表结构及用途,以Hive0.13为例。
文章最后面,会以一个示例来全面了解一下,
Spring 3.2.14,4.1.7,4.2.RC2发布
wiselyman
Spring 3
Spring 3.2.14、4.1.7及4.2.RC2于6月30日发布。
其中Spring 3.2.1是一个维护版本(维护周期到2016-12-31截止),后续会继续根据需求和bug发布维护版本。此时,Spring官方强烈建议升级Spring框架至4.1.7 或者将要发布的4.2 。
其中Spring 4.1.7主要包含这些更新内容。