Java设计模式
Java 设计模式
DayFight_DayUp
尚未工作,有找实习的意向。
展开
-
设计模式-----六大设计原则,成为优秀程序员的必经之路
编程是需要有一定的原则的,没有一定的原则,编出来的代码只是一堆糟糕的代码:下面我们就介绍这六大原则:单一职责原则、里氏替换原则、依赖倒置原则(面向抽象编程)、接口隔离原则、迪米特原则(最少知识原则)、开闭原则。1. 单一职责原则:一个类只有一个引起这个类变化的原因。即一个类只完成一个功能,如果做不到一个类只完成一个功能,最少要保证一个方法只完成一个功能。我们很多时候,为了区分功能模块,总...原创 2019-07-09 15:21:19 · 177 阅读 · 0 评论 -
Java单例设计模式
Java中很多设计模式。今天我们就来讲第一种常用的模式——单例设计模式。单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机原创 2016-06-14 09:53:43 · 399 阅读 · 0 评论 -
Java组合模式
组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。如果有需求要表示整体和部分的关系,那就使用组合模式:就以文件白遍历来说:文件夹和文件都属于文件:那么我们先定义抽象的文件:public interface...原创 2019-07-17 15:32:29 · 159 阅读 · 0 评论 -
Java备忘录模式-------实现下棋,悔棋,恢复
很多的时候,因为从事的职业分工不同,做服务端的程序员几乎用不到Java的备忘录模式,但是在其他的领域,这种模式就用的多了,比如编写PC端的应用的,Android程序员。那么备忘录模式是什么呢?备忘录模式的定义:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。它是一种对象行为型模式,其别名为Token。从上面的定义可...原创 2019-07-19 11:56:48 · 753 阅读 · 0 评论 -
Java门面模式
很多的情况下,我们调用第三方的工具的时候,我们并不需要知道某一个方法是怎么运行的或者具体是怎么实现的,实际上,调用者不需要知道被调用方的具体实现,这就是门面模式。假象一下,我们开一辆车,如果我们要手动的去打开车盖去启动引擎,然后手动的安上传动轴,然后让引擎的动力传向轮胎,使得轮胎转动,如果我们真的像上面那样操作,那我们开一次车会累成狗。所以我们引入了“自动化”的概念,把车变为一个只要启动命...原创 2019-07-17 10:24:59 · 427 阅读 · 0 评论 -
Java适配器模式
适配器模式是一种结构型设计模式。适配器模式的思想是:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。下面是实例代码:首先是需要适配的源/** * 需要适配的源 */public class Adaptee { public void method2(){ System.out.pri...原创 2019-07-17 11:17:25 · 304 阅读 · 0 评论 -
Java装饰器模式
Java的装饰器模式是结构型模式的一种,目的是增强被装饰类的功能,在JDK中,IO就使用了装饰器模式。下面是代码:人的接口:public interface Human { void run();}男人:public class Man implements Human { @Override public void run() { ...原创 2019-07-17 11:38:59 · 239 阅读 · 2 评论 -
Java桥接模式
我们都使用过JDBC,JDBC就使用的是桥接模式。DriverManager无论传入的是什么类型的Driver都能通过传入的Driver获取数据库的连接。实际上桥接模式就是把抽象部分和实现部分分离,是的他们都能独立的变化我们就以销售员卖产品为例:销售的是产品,必定要有产品类public interface Production { void beProducted();...原创 2019-07-17 12:35:29 · 138 阅读 · 0 评论 -
Java状态模式
状态模式:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Object for States),状态模式是一种对象行为型模式。《设计模式的艺术》角色分析:Context(环境类):环境类拥有各种不同状态的对象,作为外部使用的接口,负责调用状态类接口。State(抽象状态):抽象状态既可以为抽象类,也可以直接定义成接口。主要用于定义状态抽象方法,...原创 2019-07-19 16:14:33 · 287 阅读 · 1 评论 -
Java访问者模式
访问者模式定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。理解:假设有一种数据结构,有操作想访问这中数据结构,但是又不想破坏数据结构,所以就要定义访问者来访问。以账单为例:公司看账单的有财务和老板,账单有支出和收入账单,账单的数据结构肯定是不能变化的,一旦生成了账单,就只能看,不能改。但是访问者是多变的,比如...原创 2019-07-19 17:38:31 · 300 阅读 · 0 评论 -
Java享元模式
享元模式是为了节省内存的模式 内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的 对象,我们可以通过享元模式,节省内存. 享元模式以共享的方式高效地支持大量细粒度对象的重用。 享元对象能做到共享的关键是区分了内部状态和外部状态。 • 内部状态:可以共享,不会随环境变化而改变 • 外部状态:不可以共享,会随环境变化而改变以围棋的棋子作为示例棋子的大...原创 2019-07-17 17:26:36 · 138 阅读 · 0 评论 -
Java策略模式
策略思想是针对一组算法。将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。角色分析:抽象策略角色:这个是一个抽象的角色,通常情况下使用接口或者抽象类去实现。对比来说,就是我们的Comparator接口。具体策略角色:包装了具体的算法和行为。对比来说,就是实现了Comparator接...原创 2019-07-17 17:58:47 · 346 阅读 · 0 评论 -
Java中介者
假如有很多的对象联系很紧密,在没有中间者的情况下就会像下面这种方式:那么有了中介者,就会变成以下这种方式:先来看看中介者的定义:使用中介者模式来集中相关对象之间复杂的沟通和控制方式,使得这些对象不必相互明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。中介...原创 2019-07-19 23:21:57 · 187 阅读 · 0 评论 -
Java解释器模式
我们学习计算机程序语言,需要符合语法,是因为编译器会帮我们翻译我们的程序代码,那么Java的解释器模式就是一种解释文法的设计模式。解释器模式定义:给定一个语言,定义它的文法得一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。从上面的定义我们知道我们知道,首先就是要有一种文法,文法就是所谓的语法,像我们的汉语一样,一般请况之下我们要有主谓宾结构,比如:我 打 你,主语是...原创 2019-07-22 15:23:02 · 195 阅读 · 0 评论 -
Java命令模式
命令模式的定义:将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作,将”发出请求的对象”和”接收与执行这些请求的对象”分隔开来。角色分析:Command :声明执行操作的接口ConcreteCommand :将一个接收者对象绑定于一个动作, 调用接收者相应的操作,以实现ExecuteClient:创建一个具体命令对象并设定它的接...原创 2019-07-18 18:02:59 · 253 阅读 · 0 评论 -
Java责任链模式
现实中,我们会遇到很多需要有流程的事,比如请假审批,请假一天找组长,请假两天找经理,请假三天找老板,如果我们把业务耦合起来,我们会写很多分支语句,这样看起来代码就很冗长,如果使用了责任链模式,那就避免了写很多的if else,审批流程也会解耦。接下来我们就以请假来作为示例,实现责任链模式:首先我们要限定职位和等级:public enum Position { Staff(0...原创 2019-07-18 17:06:36 · 198 阅读 · 0 评论 -
Java迭代器模式
面向对象中有一些聚合对象(即一组对象的组合结构,如Java集合、数组等),迭代器模式就是为了不暴露聚合对象的内部结构的情况下,提供顺序访问聚合对象的方式。迭代器模式:提供一个方法去顺序防问一个集合中的元素,而又不暴露这些元素的内部表示角色分析:抽象迭代器具体迭代器抽象聚合类具体聚合类上代码:这个是抽象的聚合对象public interface MyContai...原创 2019-07-18 15:27:45 · 170 阅读 · 0 评论 -
JDK实现动态代理,以及InvocationHandler接口invoke()方法的三个参数的作用
先上代码:首先是要被代理的接口:/** * 被代理的主体需要实现的接口 */public interface Subject { String doSomething(String thingsNeedParm); String doOtherNotImportantThing(String otherThingsNeedParm);}然后是代理接口的...原创 2019-07-10 16:21:52 · 6260 阅读 · 0 评论 -
JDK动态代理,代理接口没有实现类,实现动态代理
JDK代理,代理的是接口,那么笔者想一想,既然代理的是接口,那如果没有实现类怎么办,能不能代理。答案是可以的,Mybatis就是这样的。Mybatis使用JDK动态代理来实现Mapper接口,事先保存好Mapper接口,和接口声明的方法,返回值,参数类型,然后代理类的方法调用的时候使用MapperMethod这个事先放入方法缓存里的对象来真实调用功能。笔者极度简化了一下代码:被代理的接...原创 2019-07-10 17:20:14 · 8274 阅读 · 5 评论 -
cglib动态代理实现,和JDK动态代比较
首先我们看一下cglib是怎么实现动态代理的:上代码:/** * 被代理的某一个类,注意,没有实现任何的一个接口 */public class SubjectService { public String doSomethings(String needTool){ System.out.println("用" + needTool + "做一些事情");...原创 2019-07-11 10:22:34 · 270 阅读 · 0 评论 -
Java实现简单工厂,以及对简单工厂的思考
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。相应的角色:1. 抽象产品角色2. 具体产品角色(实现抽象工厂角色,具体实现细节)3. 工厂角色(用于生产具体角色)代码:首...原创 2019-07-11 11:51:01 · 777 阅读 · 0 评论 -
Java实现工厂方法模式,以及对工厂方法模式的见解
工厂方法模式和简单工厂一样是一个很简单易懂的模式,简单工厂是传入不同的参数来获取想要的对象,工厂方法模式就是,一类或者一个产品有一个专门的工厂。工厂方法模式的角色:1. 抽象的产品接口2. 抽象的工厂接口3. 具体产品4. 生产具体产品的工厂下面上代码,以生产汽车为例,我们要分别生产奔驰汽车和大众汽车:汽车接口:public interface Car { ...原创 2019-07-11 15:37:08 · 248 阅读 · 0 评论 -
Java模板方法模式
模板,顾名思义,就是定义了做一件事的步骤,比如做一道菜,规定为,先洗菜,再切菜,再烹饪调味,再装盘。模板就事把上面的做一道菜的步骤定死了,但是具体洗菜怎么洗,切菜怎么切,推迟到子类实现。为了让说明更清晰我们就以做菜来作为示例,实现模板方法模式。上代码:首先要定义一个模板,最好定义模板的就是抽象类了public abstract class AbstractCooking {...原创 2019-07-18 10:16:31 · 176 阅读 · 1 评论 -
Java抽象工厂模式详解
工厂方法模式有一个缺点,他的一个工厂只能生产一种产品,那么要解决工厂类爆炸,我们就引入的产品族的概念,产品族就是把产品分类,比如:大众的汽车厂只能生产大众的轮子、底盘、引擎奔驰的汽车厂只能生产奔驰的轮子、底盘、引擎轮子、底盘、引擎分别就属于不同的产品族(轮子族、底盘族、引擎族)抽象工厂的模式角色分析:1. 抽象的各种产品族(产品接口)2. 集成各种产品族的具体实现类(具体...原创 2019-07-11 16:54:21 · 184 阅读 · 0 评论 -
Java构建者模式
当我们要是使用一个复杂的对象(构造起来相当的麻烦)的时候,我们希望不要去关心这个对象是怎么被构建的,那么我们就要使用构建者模式,把使用和构建的工作分开。角色分析:1. 抽象的构建者2. 被构建者3. 具体的构建者以构建一辆车为例:首先我们需要定义规范,定义一样汽车如何构建:public interface CarBuilder { void buildEng...原创 2019-07-11 17:21:15 · 454 阅读 · 0 评论 -
Java观察者模式
假设有一种这样的情况,一方被多方实时监控的,一方一旦发生改变,监控他的多方立马就能知道。在Java设计模式中,这个叫观察者模式,观察者观察被观察者,被观察者改变,立马通知观察者。每天我们的生活总是会被天气影响,添衣服,减衣服,打伞,都是被天气影响的。所以观察者模式笔者就以天气和各种气象站为例。实现观察者设计模式:上代码:首先定义观察者接口和公示接口:/** * 观察者接口...原创 2019-07-18 11:55:06 · 146 阅读 · 0 评论 -
被人推崇的原型模式,请慎重使用!!!
最近遇到的大脸的事儿:笔者最近遇到一个尴尬的事情,同事问我使用原型模式快还是使用new快,笔者根据自己为对的经验,很肯定的回答说,原型模式肯定比new一个对象快。但是我最近在回顾原型模式的时候,心血来潮做了一下测试:下面上代码:public class User implements Serializable,Cloneable{ private Integer age...原创 2019-07-10 10:58:39 · 897 阅读 · 0 评论 -
FastByteArrayOutputStream和ByteArrayOutputStream来深拷贝对象,到底谁的效率高呢?
原型模式中要实现深拷贝对象,一般是要重写clone()方法,因为有一些对象是没有实现Cloneable接口的,比如String,Integer,BigDecimal,这些常用的类都没有实现Cloneable接口。但是很多情况下,如果重写clone()方法实现深拷贝,又会重新new对象(为了使引用对象指向是一个新的内存地址),像下面这样: @Override protected User...原创 2019-07-10 11:54:41 · 4193 阅读 · 0 评论