设计模式
文章平均质量分 87
夏诗曼CharmaineXia
日拱一卒,功不唐捐
展开
-
Java IO | 装饰器模式 | 扩展和定制流功能
Java中的装饰器类位于java.io包中。这些类实现了装饰器模式,允许我们在IO流中添加额外的功能。原创 2023-07-18 17:31:48 · 3596 阅读 · 0 评论 -
多态的理解以及作用
一、多态是什么 多态在面向对象中的定义:指为不同数据类型的实体提供统一的接口。 比如有动物(Animal)之类别(Class),而且由动物继承出类别鸡(Chicken)和类别狗(Dog),并对同一源自类别动物(父类)之一消息有不同的响应,如类别动物有“叫()”之动作,而类别鸡会“啼叫()”,类别狗则会“吠叫()”,则称之为多态。二、多态的类型 多态分为静态多态和动态多态。静态多态:在编译期间实现多态,相同的方法传递不同的参数,实现不同的效果。 C++代码实现:// print()函原创 2022-05-27 15:54:48 · 3528 阅读 · 1 评论 -
设计模式三种类型
场景下,针对某类问题的某种通用的解决方案。场景:项目所在的环境问题:约束条件,项目目标等解决方案:通用、可复用的设计,解决约束达到目标。设计模式可以分为三种类型● 创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程。● 结构型模式:把类或对象结合在一起形成一个更大的结构。● 行为型模式:类和对象如何交互,及划分责任和算法。1 创建型模式对象实例化的模式,创建型模式用于解耦对象的实例化过程。这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接原创 2021-10-24 19:47:15 · 3067 阅读 · 7 评论 -
类的六大关系——依赖和关联的区别
对于很多刚刚接触UML的童鞋,可能会对类之间的关联与依赖关系不太理解,今天小菜就浅薄的讲一下。 依赖表现为函数中的参数(use a),是类与类之间的连接,表示一个类依赖于另一个类的定义,其中一个类的变化将影响另外一个类。例如如果A依赖于B,则B体现为局部变量,方法的参数、或静态方法的调用。如电视(TV)依赖于频道(channel)常见的依赖关系如下:(1)类B以参数的形式传入类A的方法。我个人将它就取名为“参数依赖”。(2)类B以局部变量的形式存在于类A的方法中。我个人将它就取名为“局部依赖转载 2021-10-02 14:17:24 · 3877 阅读 · 7 评论 -
装饰模式——添衣加被
装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。原创 2020-11-23 14:14:45 · 442 阅读 · 18 评论 -
访问者模式——访问者与元素
访问者模式(Visitor)定义:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 使用场景:适用于数据结构相对稳定的系统(访问者角色稳定,不多变)一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor模式使得你可以将相关的操作集中起来 定义在一个类中。当该对象结构被很多应用共享时,原创 2020-12-16 16:47:52 · 201 阅读 · 27 评论 -
解释器模式——解释语言
解释器模式(interpreter)定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 优点:扩展性好。由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法。容易实现。在语法树中的每个表达式节点类都是相似的,所以实现其文法较为容易。 缺点:执行效率较低。解释器模式中通常使用大量的循环和递归调用,当要解释的句子较复杂时,其运行速度很慢,且代码的调试过程也比较麻烦。会引起类膨胀。解释器模式中的每条规则至原创 2020-12-15 15:29:37 · 165 阅读 · 23 评论 -
中介者模式——安理会做中介
中介者模式(Mediator)定义:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。 使用场景:一组对象以定义良好但是复杂的方式进行通信的场合想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合 优点:类之间各司其职,符合迪米特法则。降低了对象之间的耦合性,使得对象易于独立地被复用。将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系原创 2020-12-15 09:07:06 · 254 阅读 · 25 评论 -
职责链模式——向上级申请加薪
职责链模式(Chain of Responsibility)定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。也叫责任链模式。 优点:降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。增强了给对象指派职责的灵活性原创 2020-12-14 20:42:26 · 242 阅读 · 19 评论 -
命令模式——经营烧烤摊
命令模式(Command)定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。 例如去饭馆吃饭,菜单不是等到客人来了之后才定制的,而是已经预先配置好的。这样,客人来了就只需要点菜,而不是任由客人临时定制。餐厅提供的菜单就相当于把请求和处理进行了解耦,这就是命令模式的体现。 使用场景:方法的请求者”与“方法的实现者”之间存在紧密的耦合关系时 优点:通过引入中间件(抽象接口)降低系原创 2020-12-14 19:37:19 · 439 阅读 · 15 评论 -
迭代器模式—遍历的初级阶段
迭代器模式(Iterator)定义:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 这个模式现在己经被写在语言中,例如C#的foreach in,但是还是可以了解一下迭代器模式的基本结构。 优点:访问一个聚合对象的内容而无须暴露它的内部表示。遍历任务交由迭代器完成,这简化了聚合类。它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。增加新的聚合类和迭代器类都很方便,无须修改原有代码。封装性良好,为遍历不同的聚合结构提供一个统一的接口。原创 2020-12-14 10:35:36 · 342 阅读 · 18 评论 -
备忘录模式——存档读档
备忘录模式(Memento)定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。该模式又叫快照模式。 使用场景:使用命令模式时,需要实现命令的撤销还原错误或无效的状态 结构:发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起原创 2020-12-13 19:55:11 · 233 阅读 · 11 评论 -
状态模式——打工人一天的状态变化
状态模式(State)定义:当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。 什么是状态: 应用程序中的部分对象可能会根据不同的情况做出不同的行为,我们把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态 优点:将与特定状态相关的行为放到该状态中,并且将不同状态下的行为分割开来,消除了选择语句,满足“单一职责原则”将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖。状态类职责明确,有利于程序的扩展。通过定原创 2020-12-13 11:00:22 · 209 阅读 · 14 评论 -
享元模式——大大方方共享对象
享元模式(Flyweight)定义:运用共享技术有效地支持大量细粒度的对象。 享元模式的定义提出了两个要求,细粒度和共享对象。因为要求细粒度,所以不可避免地会使对象数量多且性质相近,此时我们就将这些对象的信息分为两个部分:内部状态和外部状态。 享元对象的状态分类:内部状态:在享元对象内部且不会随着环境改变而改变的共享部分外部状态:随环境改变而改变的,不可共享的部分(例如五子棋中,棋子的黑白两色是内部状态,棋子的方位坐标是外部状态) 使用场景:程序使用了大量的对象,而这些对象造成原创 2020-12-12 16:07:48 · 216 阅读 · 9 评论 -
组合模式——统一的公司结构
组合模式(Composite)模式定义:将对象组合成树形结构以表示"部分—整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 使用场景:体现部分与整体层次的结构时忽略组合对象与单个越想的不同,统一的使用组合结构中的所有对象 (整体和部分可以被一致对待) 分类:透明方式:子继承父,并具备父类所有方法,这样子类与子类之间对于外界没有区别,具备完全一致的行为接口(允许重写的方法无意义)。安全方式 :子类1继承父,不去声明无意义的方法;子类2继承父,能声明所有父类方法原创 2020-12-12 10:23:14 · 423 阅读 · 17 评论 -
桥接模式——1.分类2.找联系3.继承
桥接模式(Bridge)定义:将抽象部分与它的显示部分分离,使它们都可以独立地变化。 桥接模式的目的是松耦合,另外也用到了合成/聚合复用原则(尽量使用合成/聚合,尽量不要使用继承)。因为继承是一种强耦合关系,所以我们优先考虑把类分好,然后找到类之间的合成/聚合关系,到最后再使用继承。Implementor类: abstract class Implementor { public abstract void Operation();//抽象方法Operation原创 2020-12-09 17:17:33 · 171 阅读 · 13 评论 -
适配器模式——在NBA我需要翻译
适配器模式(Adapter)定义:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 使用场景:复用一些现存的类,但接口又于复用环境不一致双方都不太容易修改的时候 代码背景: 姚明去美国打NBA,但是不会英语无法和教练球员沟通,翻译就起到了适配器的作用。球员类: abstract class Player { protected string name; publ原创 2020-12-09 11:48:21 · 245 阅读 · 13 评论 -
单例模式(懒汉和饿汉)——独生子女挺好
单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。 特点:单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。 懒汉和饿汉的区别:饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了;而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题;懒汉式本身是非线程安全的,为原创 2020-12-09 10:36:38 · 2068 阅读 · 19 评论 -
抽象工厂模式——换DB了怎么办
抽象工厂模式(Abstract Factory)定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 代码背景:假设User表里有两个字段:ID和Name,要求写一段程序,让两种数据库语言实现对这俩字段的插入和查询。使用工厂模式: User表类:用户类,假设只有ID和Name两个字段 class User { private int _id; private string _name;原创 2020-12-08 16:47:44 · 225 阅读 · 17 评论 -
观察者模式(委托和事件)——老板来了我不知道
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。玩游戏的同事: class GameObserver { private string name; private Subject sub; public GameObserver(string name,Subject sub) .原创 2020-12-07 11:30:41 · 372 阅读 · 17 评论 -
委托和事件——老鼠跑和猫叫
CatShoutEventArgs 类:猫叫事件参数类,目前的属性只有猫的name //EventArgs是包含事件数据的类的父类,作用是事件触发时传递数据 class CatShoutEventArgs : EventArgs { private string name; public string Name { get{return name;} set { name = value;原创 2020-12-07 10:27:05 · 224 阅读 · 14 评论 -
建造者模式——画胖小人和瘦小人
建造者模式(Builder)定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 使用场景:创建复杂对象的算法应该独立于该对象的组成部分,以及他们的装配方式时。当构造过程必须允许被构造的对象有不同表示时。 例子背景:甲方需求是画出胖小人或瘦小人,到底要画哪个不确定,并且不想了解画小人的过程。乙方把任务交给指挥者,让画胖小人的画手1和画瘦小人的画手2都听指挥者的命令,指挥者让谁画谁就画,两个人的动作都是画画,但是画出来的内容不一样。建造人类:抽象类原创 2020-12-06 10:16:31 · 354 阅读 · 16 评论 -
外观模式——基金帮我炒股
外观模式(Facade)定义:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。这个接口也可称作门面。● 门面(Facade)角色 :客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。● 子系统(SubSystem)角色 :可以同时有一个或者多个子系统。每个子系统都不是一个单独的类,而是一个类的集合(如下面的子系统就是由Stock1、Stock2原创 2020-12-05 20:24:11 · 169 阅读 · 16 评论 -
模板方法模式——题号都抄错了
模板方法模式(TemplateMethod): 定义一个操作中的算法的骨架,将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 很好的实现了代码复用,把不变的行为放置到超类中,去除子类的重复。 例子背景: 家教老师要给两个学生出同一套题,两个学生太笨题目都分不清顺序,没办法老师要求再考一次,并且让学生把题目(题号)先写下来。试卷类:class TestPaper //给出了逻辑骨架,具体实现留到了子类中 { publ原创 2020-12-05 11:32:41 · 1985 阅读 · 16 评论 -
原型模式——找工作要复印简历
原型模式(Prototype)定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型类:abstract class Prototype{ private string id; public Prototype(string id) //构造函数重载 { this.id=id; } public string Id //Id属性只读 { get {return id;} } public abstract Prototype Clone();原创 2020-12-05 10:46:39 · 217 阅读 · 14 评论 -
类与类的六种关系与UML图
类的关系:泛化(继承) = 实现 > 组合 > 聚合 > 关联 > 依赖泛化:(is-a),类与类、接口与接口的继承关系****************************************************************************************实现:指的是一个class类实现interface接口(可以是多个)的功能*************************************原创 2020-12-04 14:49:58 · 355 阅读 · 14 评论 -
代理模式——为他人做嫁衣裳
代理(Proxy)模式定义:为其它对象提供一种代理以控制对这个对象的访问。 代理(Proxy)模式的两个使用场合:远程代理,为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。虚拟代理,根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,达到性能最优化。安全代理,用来控制真实对象访问时的权限。智能指引,当调用真实对象时,代理处理另外一些事。1.模式的结构 装饰模式主要包含以下角色。Subject类:定义RealSubject和原创 2020-11-24 14:52:13 · 190 阅读 · 83 评论