![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
石格尔
这个作者很懒,什么都没留下…
展开
-
【原型模式】
原型二字表示该模式应该有一个样板实例,并通过复制这些实例的方法来创建新的对象。 区别于new一个新的对象,clone实际上在在内存上以二进制流的方式完成实例的克隆。所以,就像C++的类的克隆函数一样,类的创建并不会执行构造函数,那么有人可能就要问了,那么我们如何初始化数据呢? 答案是覆写clone方法,如下: public class Prototype implements Cloneable { private String mText; private ArrayList<Str原创 2022-01-17 09:47:53 · 187 阅读 · 0 评论 -
【模板方法模式】
模板方法实际上时封装一个固定流程,就像执行一套执行模板一样,第一步该做什么,第二步该做什么,都已经在抽象类中定义好。而子类可以有不同的算法实现,在框架不被修改的情况下实现某种特定步骤的算法。 在重构时,模板方法就是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。 public abstract class AbstractTemplate { public void stepA() {}; public void stepB() {}; public fin原创 2022-01-12 14:25:17 · 66 阅读 · 0 评论 -
【迭代器模式(了解即可)】
创建一个迭代器,并将一个容器类注入迭代器,使用迭代器这个中间件来实现对容器类的迭代操作 迭代器模式又称为游标模式,它最早源于对容器类的访问。如果我们把遍历的方法放在容器中,那么对于容器类而言就承载了太多的功能,不太符合单一职责原则,而如果暴露给用户实现又会暴露对象的内部实现,因为,迭代模式应运而生,在访问类和容器类中插入了个第三者——迭代器。 public class ConcreteIterator<T> implements Iterator<T> { private L原创 2022-01-12 14:13:57 · 90 阅读 · 0 评论 -
【状态模式与策略模式】
【状态模式】 提到状态,首先应该想到的就是编译原理中的状态机,状态机的一个典型的特征就是处于不同的状态时遇到同义词时执行的操作不同。 由此,我们可以很容易的类比出:当一个对象的行为取决于它的状态,并且它在处于不同状态下相同的行为执行的操作不同的话,我们就可以使用状态模式,将一种对象的n种状态封装成n个状态对象,该对象持有一个状态的引用,当执行某种操作导致状态发生变化时,将对象中状态的引用指向另一种状态,这样,对象的任意操作就只要委托给不同的状态对象即可。 状态模式的简单实例如下所示: // 状态类 clas原创 2022-01-12 14:12:36 · 292 阅读 · 0 评论 -
【命令模式】
命令模式即为把一个命令包装成一个请求,从而实现 调用方 和 实现方的弱耦合;同时,可以对请求进行排队和请求日志的记录,用于实现可撤销的操作和流程的控制。 // 命令模式有三个角色:接收者,命令和请求者 public class Receiver { public void action() {} } // 接收者就是执行具体逻辑的角色,任何一个类都可以作为接收者,而执行具体逻辑的方法被称为行动方法 public interface Command { void excete(); } p原创 2022-01-12 14:08:56 · 92 阅读 · 0 评论 -
【中介者模式】
在我们开发的过程中,一个类肯定会与其他类产生依赖关系,如果这个依赖关系如网状般复杂,那么就会导致代码的耦合度很高。 提到中介,我们第一个应该想到的就是租房中介,那么我们就以租房中介来介绍中介者模式:假设有n个人想要租房,共找到m个房主,假设每一个人都把m个房子都看完再决定租哪个,那么整个系统共有(m* n)种依赖关系,这时我们引入一个租房中介,他负责与每个人和每个屋主交互,那么,这时就只有(m + n)种依赖关系,且所有的依赖关系都是和中介的依赖。( m + n < m * n m和n都为正整数,通过原创 2022-01-12 10:02:01 · 121 阅读 · 0 评论 -
【建造者模式】
建造者模式是一个一步一步创建一个复杂对象的设计模式。它可以在一个复杂对象执行相同的方法不同的顺序但是结果不同的特殊情况下对这个复杂对象的构造过程又更加精细的控制。 它一般被用于以下两种情况:① 复杂的对象构建,多个函数,执行的顺序不同,产生的结果也不同的情况 ② 当一个对象初始化特别复杂但里面的各个成员变量都有默认值时。 public class Builder { private Product mProduct; // Product类是产品类 Builder(Product produ原创 2022-01-12 10:00:09 · 58 阅读 · 0 评论 -
【单例模式】
单例模式即保证一个类只有一个实例,而且自行实例化并向整个系统提供整个实例。 常见的有以下几种需要使用单例: (1)一个类只需要维持一个实例,可以减少内存的开支,同时提供一个全局的访问点便于控制,如用户的登录状态。 (2)避免对资源的多重占用或访问安全,例如数据库单例类 (3)在生成一些大对象的时候,减少性能的开销,例如线程池 单例模式有以下几个关键点: (1)构造函数不对外开放,这样就没法通过new一个对象的方式来创建实例(TODO: 那么使用类加载器方式呢?),与之相对的,提供一个静态方法用于返回唯一的实原创 2022-01-12 09:46:20 · 62 阅读 · 0 评论 -
【工厂模式】
工厂模式是一种典型的创建者模式,当我们需要创建多个相似但是不同的(即都实现一个接口的类)实体类时,我们可以引入工厂类。 工厂模式的引入主要是为了应对需求的变化,主要是基于“在创建一个对象时,需要把容易发生变化的地方给封装起来,来控制变化(哪里变化,封装哪里),以适应客户的变动,项目的扩展 ”的思想。 按照抽象的层次从低到高分别是:简单工厂模式,工厂方法模式和抽象工厂模式。 // 简单工厂模式 class Factory { public static createProduct(Class<T原创 2022-01-12 09:43:39 · 55 阅读 · 0 评论 -
【责任链模式】
在实际编程开发的过程中,我们常常遇到这种情况,当一个请求到达后,我们需要一个分支很多,且每一个分支都很复杂的ifelse或switchcase语句。在这种情况下,如果我们想要增加新的分支,往往时比较复杂的,由此,我们引入责任链模式。 责任链是一种类似于链表式结构,如果我们把链表每个节点可以看做一个Handler,每个Handler有不同的处理逻辑,将一个请求从链的首端发出,沿着链的路径依次经过每个Handler,直到有Handler处理这个请求为止,我们将这样一种模式称为责任链模式。 // 抽象handle原创 2022-01-12 09:29:19 · 59 阅读 · 0 评论 -
【代理模式/装饰模式】
代理模式通常指为其他对象提供一种代理以控制对另一个对象的访问,简单的说,就是当我们无法或不能直接访问某个对象时可以通过一个实现了与该对象相同接口的一个类来实现对该类的间接访问。 装饰模式是在代理模式的基础上进行扩展,增加一些被代理类不存在的类,以扩展被代理类的一些功能。这种扩展并不破坏原有类的功能。 // 实现 public interface Subject { public void method(); }; public class RealSubject { public void原创 2022-01-12 09:22:38 · 80 阅读 · 0 评论 -
【组合模式】
组合模式又称为部分整体模式,主要是为了处理树状的数据结构,提供一个统一的接口来屏蔽掉集合和个体之间的差异,以此忽略掉对象和对象集合之间的差异。例如:多级目录的显示就可以使用这种组合模式的数据结构。 public abstruct class Component() { public abstruct addChild(); public abstruct doSomething(); } public class Composite extends Component { priv原创 2022-01-12 09:18:58 · 99 阅读 · 0 评论 -
【适配器模式】
适配器模式实际上就是把两个不兼容的类融合在一起,简单的说来,就是如果把一个需要适配的类(Adaptee)通过适配器角色(Adapter)将其转化成目标角色(Target)。 该模式一般用于处理接口不符合系统的需要,即接口不兼容的情况。 打个比方说,当我们要访问的接口Target中没有我们想要的方法 ,却在另一个接口Adaptee中发现了合适的方法,我们又不能改变Targe,在这种情况下,我们可以定义一个适配器Adapter来进行中转。 这个适配器Adapter要实现我们访问的接口Target,这样我们就能继原创 2022-01-11 16:59:09 · 122 阅读 · 0 评论