0103【23种设计模式】
只要包含一些设计模式的思想和代码实现
努力的阳光蓝孩
学习一时爽,一直学习一直爽
展开
-
设计模式学习笔记四十六、解释器模式
一、问题1、通过解释器模式来实现四则运算,比如计算a+b+c的值2、先输入表达式的形式,比如a+b+c+d+e 要求表达式的字母不能重复3、最后求结果二、基本介绍1、在编译原理中,一个算术表达式通过词法分析形成词法单元,而后这些词法单元再通过与法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析和语法分析可以看作是解释器模式。2、解释器模式(Interpreter Pattern):是指给定一个语言(表达式),定义他的文法的一种表示,并定义一个解释器,使用该解释器来解原创 2020-05-28 08:45:48 · 110 阅读 · 0 评论 -
设计模式学习笔记四十五、中介者模式
一、问题详情见外观模式二、介绍1、中介者模式(Mediator Pattern),用一个中介者对象来封装一系列的对象交互,中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。2、中介模式属于行为模式,使代码易于维护。3、比如MVC模式 C(Controller):控制器 是M(Model):模型 和 V(View):视图的中介者。...原创 2020-05-26 23:30:02 · 101 阅读 · 0 评论 -
设计模式学习笔记四十二、观察者
一、需求1、气象站可以将每天测量到的温度、湿度、气压等等以公告的形式发布出去(比如发布到自己的网站或者第三方)2、需要设计开放性的PAI,便于其他第三方也能接入气象站数据3、提供温度、气压和湿度的接口4、测量数据更新时,要能实时的通知给第三方二、 观察者模式介绍1、对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject 通知Observer变化。三、代码package com.hao.demo.design.observ原创 2020-05-26 08:21:32 · 80 阅读 · 0 评论 -
设计模式学习笔记四十一、迭代器模式
一、介绍1、迭代器模式(Iterator Pattern)是常用的设计模式,属于行为模式。2、如果集合元素是不同的方式实现的,有数组,还有java的集合类,或者还有其他的方式,当客户端要遍历这些集合元素 => 可以考虑迭代器模式。3、迭代器模式:提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,不暴漏其内部的结构。1)Iterator:迭代器接口,系统提供。含义hasNext,next ,remove2)ConcreteIterator:具体的原创 2020-05-25 09:22:58 · 124 阅读 · 0 评论 -
设计模式学习笔记四十、访问者模式
一、问题1、将观众分为男人和女人,对歌手进行测评,当看完某个歌手的表演后,得到他们对歌手的不同评价(比如:成功、失败)二、访问者模式1、访问者模式(Visitor Pattern)封装一些作用于某种数据结构的各元素的操作,他可以在不改变数据结构的前提下定义作用于这些元素的新的操作。2、解决数据结构和操作耦合性问题3、工作原理:在被访问的类里面加一个对外提供接待访问者的接口。4、场景:需要对一个对象结构中的对象进行很多不同操作(这些操作彼此没有关联),同时需要避免让这些操作“污染”这些原创 2020-05-25 08:21:44 · 112 阅读 · 0 评论 -
设计模式学习笔记三十九、命令模式
一、百度百科1、命令模式(Command Pattern),在软件设计中我们经常需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道被请求的操作是那个。只需在程序运行时指定具体的请求接受者即可,此时,可以用命令模式来进行设计。2、命令模式使得请求发送者与请求接受者消除彼此之间的耦合,让读写之间的调用关系更加灵活,实现解耦。3、在命令模式中,会将一个请求封装为一个对象,以便使用不同参数来表示不同的请求(即命令),同时命令模式也支持可撤销的操作。4、通熟易懂的理解,将军发布命令,士兵去原创 2020-05-24 09:07:57 · 153 阅读 · 0 评论 -
设计模式学习笔记三十八、模版方法模式概念和代码实现
一、例子1、制作豆浆2、流程:选择材料、添加配料、浸泡、放到豆浆机打碎3、步骤对于每种口味的豆浆都是一样的。二、模版方法模式介绍1、模版方法模式(Template Method Pattern),又叫模版模式(Template Pattern)在一个抽象类公开定义了执行它的方法的模版。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。2、属于设计模式的行为模式3、抽象模版的算法骨架,具体实现在子类中进行,单步骤框架按抽象类的流程走。三、模版方法模式之钩子方法原创 2020-05-23 17:00:54 · 142 阅读 · 0 评论 -
设计模式学习笔记三十七、享元模式代码实现
package com.hao.demo.design.flyweight;/** * @author * @date 2020-05-22 */public abstract class WebSite { public abstract void use(User user);}package com.hao.demo.design.flyweight;/** * @author * @date 2020-05-22 */// 具体的网站public class.原创 2020-05-22 09:16:20 · 105 阅读 · 0 评论 -
设计模式学习笔记三十六、享元模式了解
一、问题1、小型的外包项目,给客户做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求有些不同。2、有客户要求以新闻的形式发布3、有客户要求以博文的形式发布4、有客户希望以公众号的形式发布二、享元介绍1、享元模式(Flyweight Pattern) 也叫蝇量模式,运用共享技术有效的支持大量细粒度的对象。2、常用与系统底层开发,解决系统的性能问题,像数据库连接池,里面都是创建好的连接对象,在这些对象中有我们需要的则直接拿来用,避免重复创建,如果没有我原创 2020-05-22 09:15:12 · 164 阅读 · 0 评论 -
设计模式学习笔记三十五、策略模式代码实现
package com.hao.demo.design.improvestrategy;/** * @author * @date 2020-05-21 */public interface FlyBehavior { void fly();}package com.hao.demo.design.improvestrategy;/** * @author * @date 2020-05-21 */public class GoodFlyBehavior imple.原创 2020-05-21 08:55:20 · 121 阅读 · 0 评论 -
设计模式学习笔记三十四、策略模式概念
一、问题1、有各种鸭子:野鸭、北京鸭、水鸭等。2、鸭子的行为:叫、飞等。3、显示鸭子信息。二、方案1、继承方式2、策略模式三、策略模式介绍1、策略模式中(Strategy Pattern)中,定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立与使用算法的客户。2、这算法体现了几个设计原则:1)把变化的代码从不变的代码中分离出来;2)针对接口编程而不是具体的类(定义了策略接口)3)多用组合/聚合 少用继承 (客户通过组合方式使用策略)四原创 2020-05-21 08:52:46 · 177 阅读 · 0 评论 -
设计模式学习笔记三十四、代理模式Cglib动态代理代码实现
一、介绍1、静态代理和JDK代理模式都要求目标是实现一个接口,但是有时候对象只是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现代理=>Cglib代理归属到动态代理。2、Cglib代理也叫作子类代理,它是在内存中构建一个子类对象,从而实现对目标对象功能扩展。3、Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接口,它广泛的被许多AOP的框架使用,例如Spring AOP ,实现方法拦截4、在AOP编程中如何选择代理模式:1)目标对象需原创 2020-05-20 21:43:29 · 164 阅读 · 0 评论 -
设计模式学习笔记三十三、代理模式JDK动态代理代码实现
1、代理主要实现类package com.hao.demo.design.dynamic;import java.lang.reflect.Proxy;/** * @author haoxiansheng * @date 2020-05-20 */// 核心public class ProxyFactory { // 维护一个目标对象 Object private Object target; public ProxyFactory(Object targ原创 2020-05-20 09:08:49 · 113 阅读 · 0 评论 -
设计模式学习笔记三十二、静态代理代码演示
package com.hao.demo.design.staticproxy;/** * @author haoxiansheng * @date 2020-05-20 */// 代理对象 代理TeacherDAOpublic class TeacherDAOProxy implements ITeacherDAO{ private ITeacherDAO targert; // 通过接口来聚合目标对象 // 构造器 public TeacherDAOProxy.原创 2020-05-20 09:06:37 · 96 阅读 · 0 评论 -
设计模式学习笔记三十一、代理模式了解(静态代理、JDK代理、Cglib代理)
一、介绍1、作为一个对象提供一个替身,以控制这个对象的访问,即通过代理对象访问目标对象。这样做的好处是可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。2、被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。3、代理的模式有不同的形式,主要有静态代理、动态代理(JDK代理、接口代理)、Cglib代理(可以在内存动态创建对象,而不需要实现接口,属于动态代理的范畴)二、静态代理1、在使用时,需要定义接口或者父类,被代理对象(目标对象)与代理对象一起实现相同的原创 2020-05-20 09:04:44 · 141 阅读 · 0 评论 -
设计模式学习笔记三十、组合模式代码实现
代码package com.hao.demo.design.composite;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;/** * @author haoxiansheng * @date 2020-05-19 */@Data @AllArgsConstructor@NoArgsConstructorpublic abstract class Org原创 2020-05-19 08:32:00 · 132 阅读 · 0 评论 -
设计模式学习笔记二十九、组合模式概念了解
一、问题1、学校院系展示需求2、要求要在一个页面中展示出学校的院系组成,一个学校有多少个学院,一个学校有多个系。3、学校 包含学院。学院包含系二、实现方式1、继承方式:不能很好实现管理2、组合模式:三、组合模式基本介绍1、由叫部分整体式,它创建了对象的树形接口,将对象组合成树状结构表示“整体-部分”的层次关系。2、依据树形机构来组合对象,用来表示部分以及整体层次3、这种类型的设计模式属于结构型模式4、组合模式使得用户对单个对象和组合对象的访问具有一致性,即:.原创 2020-05-19 08:30:28 · 110 阅读 · 0 评论 -
设计模式学习笔记二十六、外观模式概念了解
一、问题1、创建一个影院:DVD播放器、投影仪、自动屏幕、环绕立体声、爆米花机,完成功能。2、设备开关 开爆米花、放下屏幕、开投影仪、开音响、开DVD 选择DVD 、拿爆米花、调暗灯光、播放电影结束后关闭各种设备。二、方案1、直接掉用 调用太麻烦 不方便2、外观模式三、外观模式介绍1、也叫过程模式,为子系统中的一组接口提供一个一致的界面,此模式定义一个高层接口,使得子系统更加容易使用2、外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端口只需跟这个接口.原创 2020-05-18 08:34:35 · 107 阅读 · 0 评论 -
设计模式学习笔记二十七、外观模式代码
代码package com.hao.demo.design.facade;/** * @author haoxiansheng * @date 2020-05-18 */public class DVDPlayer { // 使用单例模式 private static DVDPlayer instance = new DVDPlayer(); // 饿汉式 public static DVDPlayer getInstance() {原创 2020-05-18 08:34:38 · 138 阅读 · 0 评论 -
设计模式学习笔记二十六、装饰者模式代码
代码package com.hao.demo.design.decorator;import lombok.Data;/** * @author * @date 2020-05-16 */@Datapublic abstract class Drink { public String des; // 描述 private float price = 0.0f; // 技术费用的抽象方法 // 子类来实现 public abstract原创 2020-05-17 22:08:35 · 131 阅读 · 0 评论 -
设计模式学习笔记二十五、装饰者模式介绍
一、问题星巴克咖啡订单项目1、咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡)2、调料:Milk、Soy(豆浆)、Chocolate3、要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便4、使用OO的来计算不同种类咖啡的费用:客户可以点单品咖啡,也可以单品咖啡+调料组合二、普通解决方案1、Drink是一个抽象类,表示饮料2、des就是对咖啡的描述,比如咖啡的名字3、cost().原创 2020-05-17 22:01:59 · 81 阅读 · 0 评论 -
设计模式学习笔记二十三、桥接模式概念
一、侨接模式(Bridge)基本介绍1、是指将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变2、是一种结构型设计模式3、Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责,它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展二、描述1、Client类:桥接模式的调用者2、抽象类(Abstraction):维护了Implementor 即它的原创 2020-05-17 22:00:34 · 90 阅读 · 0 评论 -
设计模式学习笔记二十四、桥接模式代码
一、二、代码package com.hao.demo.design.bridge;/** * @author * @date 2020-05-16 */public abstract class Phone { private Brand brand; // 构造器 public Phone(Brand brand) { this.brand = brand; } protected void open() { .原创 2020-05-17 21:57:49 · 192 阅读 · 0 评论 -
设计模式学习笔记二十二、职责链模式代码演示
一、代码实例package com.hao.demo.design.responsilibalitychain;import lombok.Setter;/** * @author * @date 2020-05-17 */public abstract class Approver { @Setter Approver approver; // 下一个处理者 String name; // 名字 public Approver(String na原创 2020-05-17 21:52:20 · 101 阅读 · 0 评论 -
设计模式学习笔记二十一、职责链模式概念
一、问题1、学校OA系统的采购项目需求1)采购员采购器材2)金额小于等于5000,由教学主任审批(0<= x <= 5000)3)金额小于等于10000,由院长审批(5000<= x <= 10000)4)金额小于等于3000,由副校长审批(10000<= x <= 30000)5)金额超过30000,由教学主任审批(30000<x )2、不用设计模式传统方式1)接收到一个采购请求,根据采购金额来调用对应的Approver(审批人)完原创 2020-05-17 21:19:48 · 167 阅读 · 0 评论 -
设计模式学习笔记二十、适配器模式代码
一、类适配器代码1、手机充电案例package com.hao.demo.design.adapter;/** * @author * @date 2020-05-15 */public class Voltage220V { public int outPut220V() { int src = 220; System.out.println("电压是 =》" + src); return src; }}pack原创 2020-05-15 09:11:40 · 256 阅读 · 0 评论 -
设计模式学习笔记十九、适配器模式概念
一、问题1、多功能充电器2、多功能转换插头(适配器)二、介绍1、适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一类接口表示。主要的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协调工作。其别名为包装器(Wrapper)2、适配器模式属于结构型模式3、主要分为三类:类适配器模式、对象适配器模式、接口适配器模式三、适配器工作原理1、适配器模式:将一个类的接口转换成另一种接口,让原本不兼容的类可以兼容。2、从用户角度看不到被适配者,是解原创 2020-05-15 09:16:11 · 190 阅读 · 0 评论 -
设计模式学习笔记十七、建造者模式概念
一、问题盖房子项目需求1)需要建房子:这一过程为打桩、砌墙、封顶2)房子有各种各样的:比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同。二、介绍1、又叫生成器模式,是一种创建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。2、是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建他们,用户不需要知道内部的具体构建细节。三、建造者模式的四个角色1、Product(产品角色):.原创 2020-05-14 23:29:35 · 143 阅读 · 0 评论 -
设计模式学习笔记十八、建造者模式代码演示
一、普通方法package com.hao.demo.design.builder;/** * @author haoxiansheng * @date 2020-05-14 */public abstract class AbstractHouse { abstract void buildBasic(); abstract void buildWalls(); abstract void roofed(); void build() {原创 2020-05-14 23:29:13 · 104 阅读 · 0 评论 -
设计模式学习笔记十六、原型模式代码演示
一、简单实现未用clone1、这种方法感觉有点傻。package com.hao.demo.design.prototype;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;/** * @author * @date 2020-05-14 */@Data@AllArgsConstructor@NoArgsConstructorpublic class S原创 2020-05-14 09:24:34 · 135 阅读 · 0 评论 -
设计模式学习笔记十伍、原型模式基本概念
一、问题1、现在有10只羊,名字“tom”,年龄2, 颜色为 白色。请创建一摸一样的10只羊。2、方法一、创建一个类,添加属性。在调用端new 10 次。3、方法二、用clone方法完成。4、方法一 、传统方法容易理解,操作简单。但是在创建对象总是需要获取原始对象的属性。如果创建对象比较复杂,效率比较低。总是需要初始化对象,而不是动态的获得对象的运行状态,不够灵活。二、原型模式介绍1、用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象。2、原型模式是一种创建型模式,原创 2020-05-14 09:20:41 · 155 阅读 · 0 评论 -
设计模式学习笔记十二、工厂模式(简单工厂、工厂方法、抽象工厂)
一、需求1、完成一个披萨店订购功能2、披萨种类很多(greek、cheese、prepper)3、制作过程有prepare、bake、cut、box二、简单工厂与传统代码比较传统代码1、有点是比较好理解,简单操作2、违反了设计模式的OPC原则对扩展开放(服务方),对修改关闭(消费、调用方)3、当有新增披萨种类就需要修改服务方和调用方4、把创建披萨对象的代码封装到类中 =》简单工厂模式5、简单工厂代码三、简单工厂介绍1、简单工厂模式是属于创建型模式,是工厂模式的原创 2020-05-14 00:10:43 · 114 阅读 · 0 评论 -
设计模式笔记十四、工厂模式之工厂方法模式代码
一、主要类1、抽象类package com.hao.demo.design.factory.factorymethod.order;import com.hao.demo.design.factory.factorymethod.Pizza1;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Optional;/**原创 2020-05-14 00:09:51 · 162 阅读 · 0 评论 -
设计模式学习笔记十三、工厂模式代之简单工厂码演示
一、简单未加工厂1、代码package com.hao.demo.design.factory.simpleFactory.pizzastore.order;import com.hao.demo.design.factory.simpleFactory.pizzastore.pizza.CheesePizza;import com.hao.demo.design.factory.simpleFactory.pizzastore.pizza.GreekPizza;import com.ha原创 2020-05-13 23:47:44 · 148 阅读 · 0 评论 -
设计模式学习笔记十一、单例模式=>静态内部类、枚举代码
1、静态内部类package com.hao.demo.design.singel;/** * @author haoxiansheng * @date 2020-05-13 */public class SingletonTest7 { public static void main(String[] args) { Singleton8 instance1 = Singleton8.getInstance(); Singleton8 inst原创 2020-05-13 09:01:33 · 100 阅读 · 0 评论 -
设计模式学习笔记十、单例模式=>懒汉式代码(双重检查机制)
1、懒汉模式一package com.hao.demo.design.singel;/** * @author haoxiansheng * @date 2020-05-13 */public class SingletonTest3 { public static void main(String[] args) { Singleton3 instance2 = Singleton3.getInstance(); Singleton3 in原创 2020-05-13 08:59:16 · 205 阅读 · 0 评论 -
设计模式学习笔记九、单例模式=>饿汉模式代码
1、静态常量package com.hao.demo.design.singel;/** * @author haoxiansheng * @date 2020-05-13 */public class SingletonTest1 { public static void main(String[] args) { Singelton1 instance1 = Singelton1.getInstance(); Singelton1 instanc原创 2020-05-13 08:56:18 · 195 阅读 · 0 评论 -
设计模式学习笔记九、单例模式概述
一、介绍1、单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)2、采取一定的方法保证在整个软件系统中,对某个类只能存在一个实例对象,并且该类只提供一个取得其对象实例的方法。二、单例设计模式的八种方式1、饿汉式(静态常量)2、饿汉式(静态代码块)3、懒汉式(线程不安全)4、懒汉式(线程安全, 同步方法)5、懒汉式(线程安全,同步代码块) ==> 直接不原创 2020-05-13 09:01:47 · 109 阅读 · 0 评论 -
设计模式学习笔记八、设计模式介绍、原则
一、介绍1、设计模式不限语言2、原则尽量使用合成/聚合的方式,而不是继承的方式。=> 合成复用原则3、前面笔记7大原则二、设计模式分类(23种)1、创建型模式:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式2、结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式3、行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责.原创 2020-05-13 07:39:13 · 112 阅读 · 0 评论 -
设计模式学习笔记七、迪米特法则
一、介绍1、迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。英文简写为: LoD.2、一个对象应该对其他对象保持最少了解。3、类与类的关系越密切耦合度越大4、与直接对象交换信息、直接朋友。(成员、类内部方法的参数、类方法的返回值)5、陌生的类最好不要以局部变量的形式出现在类的内部。二、代码1、演原创 2020-05-12 09:07:08 · 311 阅读 · 0 评论